Era*_*tes 3 java ejb glassfish java-ee cdi
目前,我正在使用PersistenceContext来注入EntityManager.EM完美注入.
@Stateless
public StatelessSessionBean implements StatelessSessionBeanLocal {
@PersistenceContext(unitName = "MyPersistenceUnit")
private EntityManager em;
@Override
public Collection<MyObject> getAllObjects(){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriqQuery<MyObject> query = cb.createQuery(MyObject.class);
query.from(MyObject);
return em.createQuery(query).getResultList();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试装饰豆子,突然间em没有被注射.我得到一个NullPointerException.
@Decorator
public StatelessSessionBeanDecorator implements StatelessSessionBeanLocal {
@Inject
@Delegate
@Any
StatelessSessionBeanLocal sb
@Override
public Collection<MyObject> getAllObjects(){
System.out.println("Decorated method!");
return sb.getAllObjects();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道EJB和CDI是两个完全不同的管理器,所以那个人不了解另一个.我期望@PersistenceContext是一个EJB注入点,而@Inject是一个CDI注入点.我该怎么做才能解决这个问题并让EntityManager按照它应该注入?
Ant*_*and 11
持久化上下文和CDI的最佳实践是使它们成为CDI bean以避免这类问题.
public class MyProducers {
@Produces
@PersistenceContext(unitName = "MyPersistenceUnit")
private EntityManager em;
}
Run Code Online (Sandbox Code Playgroud)
之后,您将能够以EntityManagerCDI方式注入.拿你的EJB它将是:
@Stateless
public StatelessSessionBean implements StatelessSessionBeanLocal {
@Inject
private EntityManager em;
@Override
public Collection<MyObject> getAllObjects(){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriqQuery<MyObject> query = cb.createQuery(MyObject.class);
query.from(MyObject);
return em.createQuery(query).getResultList();
}
}
Run Code Online (Sandbox Code Playgroud)
这样,您就可以毫无问题地装饰CDI bean.
如果您有多个EntityManagers,则可以使用CDI限定符来区分它们