簡體   English   中英

使用CDI注入PersistenceContext

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM