[英]Inject PersistenceContext with 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();
}
}
現在我嘗試裝飾豆子,突然間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();
}
}
我知道EJB和CDI是兩個完全不同的管理器,所以那個人不了解另一個。 我期望@PersistenceContext是一個EJB注入點,而@Inject是一個CDI注入點。 我該怎么做才能解決這個問題並讓EntityManager像它應該注入一樣?
持久化上下文和CDI的最佳實踐是使它們成為CDI bean以避免這類問題。
public class MyProducers {
@Produces
@PersistenceContext(unitName = "MyPersistenceUnit")
private EntityManager em;
}
之后,您將能夠以CDI方式注入EntityManager
。 拿你的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();
}
}
這樣,您就可以毫無問題地裝飾CDI bean。
如果您有多個EntityManagers
,則可以使用CDI限定符來區分它們
@PersistenceContext是一個EJB注入點,而@Inject是一個CDI注入點
實際上,沒有。 @PersistenceContext
注釋可以在CDI中使用,並且不與EJB連接。 你可以這樣做:
@Named
public class EntityDAO {
@PersistenceContext
private EntityManager manager;
...
}
EJB使用@EJB
注釋來注入其他EJB,但它可以使用相同的注釋注入任何CDI bean或持久性上下文。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.