用CDI注入PersistenceContext [英] Inject PersistenceContext with CDI
问题描述
@Stateless
public StatelessSessionBean实现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();
}
}
现在我尝试装饰豆,突然间em不注射我得到一个NullPointerException。
@Decorator
public StatelessSessionBeanDecorator实现StatelessSessionBeanLocal {
@Inject
@Delegate
@Any
StatelessSessionBeanLocal sb
@Override
public Collection< MyObject> getAllObjects(){
System.out.println(Decorated method!);
return sb.getAllObjects();
}
}
我知道EJB和CDI是两个完全不同的经理,所以一个人不了解对方。我期望@PersistenceContext是一个EJB注入点,而@Inject是一个CDI。我应该如何解决这个问题,并让EntityManager被注入呢?
持久性上下文的最佳做法CDI是将它们作为CDI bean来避免这些问题。
public class MyProducers {
@Produces
@PersistenceContext(unitName =MyPersistenceUnit)
private EntityManager em;
}
之后,您将可以注入 EntityManager
以CDI方式。你的EJB将是:
@Stateless
public StatelessSessionBean实现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();
}
}
这样,你将能够装饰你的CDI bean没有问题。
如果您有多个 EntityManagers
,则可以使用CDI限定符来区分它们。 >
Currently, I'm using PersistenceContext to inject an EntityManager. The EM is injected perfectly.
@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();
}
}
Now I try to decorate the bean, and suddenly the em doesn't get injected. I get a NullPointerException.
@Decorator
public StatelessSessionBeanDecorator implements StatelessSessionBeanLocal {
@Inject
@Delegate
@Any
StatelessSessionBeanLocal sb
@Override
public Collection<MyObject> getAllObjects(){
System.out.println("Decorated method!");
return sb.getAllObjects();
}
}
I know EJB and CDI are 2 completely different managers, so the one doesn't know about the other. I'm expecting that @PersistenceContext is an EJB injection point, while @Inject is a CDI one. What should I do to solve this and get the EntityManager to be injected like it should?
The best practice for persistence context and CDI is to make them CDI bean to avoid these kind of issue.
public class MyProducers {
@Produces
@PersistenceContext(unitName = "MyPersistenceUnit")
private EntityManager em;
}
After that you'll be able to inject the EntityManager
in CDI way. Taking your EJB it'll be :
@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();
}
}
This way, you'll be able to decorate your CDI bean with no issue.
If you have multiple EntityManagers
you can use CDI qualifiers to distinguish them
这篇关于用CDI注入PersistenceContext的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!