EJB无状态会话bean中的javacdibeanproducer
假设我有一个名为db utils的简单库,它有一个CrudService CDI bean(requestScoped),我的web应用程序使用它来执行CRUD操作
我还有一个名为grad db的EJB项目,该项目将实体从数据库中映射。Grad db还拥有用于在db utils的CrudService中设置entityManager的生产者
我已经试过了,显然效果不错。我的问题是:这是一种糟糕的做法吗?在无状态会话bean中生成CDIBean并将EJB无状态bean作为参数传递给CrudService是否会产生任何后果
我的代码:
EJB Bean(grad db):
@Stateless
public class CrudServiceCae extends AbstractCrud implements Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext(unitName = "cae-pu")
EntityManager em;
@Override
public EntityManager getEntityManager() {
return em;
}
@Produces
@Database(Schema.CAE)
public CrudService createCrudServiceCou() {
return new CrudService(this);
}
}
CrudService(数据库utils):
@Named("crudService")
public class CrudService implements Serializable {
private static final long serialVersionUID = -2607003150201349553L;
private AbstractCrud crud;
public CrudService(AbstractCrud abstractCrud) {
this.crud = abstractCrud;
}
...
}
编辑: 实际上,它只适用于查询。当我试图插入数据时,我得到了javax。坚持不懈TransactionRequiredException。显然,在这种情况下,我将不得不使用继承而不是CDI
# 1 楼答案
EJB负责业务流程/逻辑(即:方法),并且能够协调其他CDI控制器,这并不常见,让EJB创建对象,因为您更喜欢CDI POJO生产者
在您的例子中,使用CDI对象并从那里生成所需的对象更容易,看起来像DAO,可以用于(我的意思是注入)EJB
根据边界模式考虑EJB,使用专门的控制器
注:
em
李>em
是个好主意,可以让你轻松地模拟你的外观/边界