用CDI注入PersistenceContext [英] Inject PersistenceContext with CDI

查看:121
本文介绍了用CDI注入PersistenceContext的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前,我正在使用PersistenceContext来注入一个EntityManager。 EM被完美注入。

  @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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆