如何在没有 setter 方法的情况下将注入 statelesbean 的实体管理器传递给 dao
How to pass entity manager injected in statelesbean to dao without setter method
我正在做一个项目,在这个项目中我将 EJB 分开,这样它们只执行业务逻辑而不执行查询。然后我还有执行查询的 DAO。为了使用 DAO,我将 DAO 注入到 EJB 中,并使用注释为@PostConstruct 的方法,我在 DAO 中设置了 EntityManager,并将 EntityManager 注入到 bean 中,如下所示:
public class ClazzDao implements ClazzDaoI{
private EntityManager em;
public void setEm(EntityManager em){
this.em = em;
}
public List<Entity> list(){
return em.createQuery("FROM Entity e").getResultList();
}
}
和 EJB
@Stateless
public class ClazzBean implements ClazzBeanI{
@PersistenceContext
private EntityManager em;
@Inject
private ClazzDaoI clazzDao;
@PostConstruct
private void init(){
clazzDao.setEm(em);
}
public BigDecimal sendEmailToMembers(){
List<Entity> members = clazzDao.list();
//do some stuff with data like say send emails...
}
}
有没有一种方法可以让 DAO 使用注入到 EJB 中的实体管理器,而无需在 EJB 的 @PostConstruct 中设置它?
您只能在容器管理的 bean 中使用注入功能。 You dao class 在容器管理之外无法将 EntityManager 注入到此对象中。如果您需要注入功能,请将您 class 放入容器管理 (EJB/CDI)。顺便避免使用不必要的接口 use non interface view instead.
确保您使用的是 JAVA EE 6 或更高版本,将 ClazzDao 作为托管 Bean,意味着 @ApplicationScoped/@SessionScoped
@ApplicationScoped
public class ClazzDao 实现 ClazzDaoI
CDI 可以注入 ClazzDao ManagedBean。
我正在做一个项目,在这个项目中我将 EJB 分开,这样它们只执行业务逻辑而不执行查询。然后我还有执行查询的 DAO。为了使用 DAO,我将 DAO 注入到 EJB 中,并使用注释为@PostConstruct 的方法,我在 DAO 中设置了 EntityManager,并将 EntityManager 注入到 bean 中,如下所示:
public class ClazzDao implements ClazzDaoI{
private EntityManager em;
public void setEm(EntityManager em){
this.em = em;
}
public List<Entity> list(){
return em.createQuery("FROM Entity e").getResultList();
}
}
和 EJB
@Stateless
public class ClazzBean implements ClazzBeanI{
@PersistenceContext
private EntityManager em;
@Inject
private ClazzDaoI clazzDao;
@PostConstruct
private void init(){
clazzDao.setEm(em);
}
public BigDecimal sendEmailToMembers(){
List<Entity> members = clazzDao.list();
//do some stuff with data like say send emails...
}
}
有没有一种方法可以让 DAO 使用注入到 EJB 中的实体管理器,而无需在 EJB 的 @PostConstruct 中设置它?
您只能在容器管理的 bean 中使用注入功能。 You dao class 在容器管理之外无法将 EntityManager 注入到此对象中。如果您需要注入功能,请将您 class 放入容器管理 (EJB/CDI)。顺便避免使用不必要的接口 use non interface view instead.
确保您使用的是 JAVA EE 6 或更高版本,将 ClazzDao 作为托管 Bean,意味着 @ApplicationScoped/@SessionScoped
@ApplicationScoped public class ClazzDao 实现 ClazzDaoI
CDI 可以注入 ClazzDao ManagedBean。