Injizieren PersistenceContext mit CDI
Derzeit bin ich mit PersistenceContext zu injizieren einen EntityManager. Die EM ist, injiziert perfekt.
@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();
}
}
Versuche ich jetzt schmücken die Bohne, und plötzlich ist die em nicht injiziert. Ich bekomme eine NullPointerException.
@Decorator
public StatelessSessionBeanDecorator implements StatelessSessionBeanLocal {
@Inject
@Delegate
@Any
StatelessSessionBeanLocal sb
@Override
public Collection<MyObject> getAllObjects(){
System.out.println("Decorated method!");
return sb.getAllObjects();
}
}
Ich weiß, EJB und CDI sind 2 völlig verschiedene Manager, so das man weiß nicht über die anderen. Ich gehe davon aus, dass @PersistenceContext ist ein EJB-injection-Punkt, während die @Inject ist ein CDI ein. Was sollte ich tun, um dieses Problem zu lösen und erhalten den EntityManager injiziert werden, wie es sollte?
- Warum sind Sie mit
@Delegate
und@Any
auf Ihrem einspritzzeitpunkt? Funktioniert die config entsprechend Ihrerbeans.xml
? Kannst du es posten? Auch bitte angeben, welche version von glassfish, die Sie verwenden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die besten Praxis für die Persistenz-Kontext und CDI ist, um Ihnen das CDI-bean zu vermeiden, diese Art von Problem.
Nach, dass Sie werde in der Lage sein, um zu injizieren, die
EntityManager
in der CDI Weg. Nehmen Sie Ihre EJB-es werden :Diese Weise werden Sie in der Lage, dekorieren Ihre CDI-bean mit kein Problem.
Wenn Sie mehrere
EntityManagers
Sie verwenden können, CDI-Qualifier, Sie zu unterscheiden@CDI
zu injizieren einerEntityManager
in Sie. Just-stick mit mit@PersistenceContext
in Ihrer EJBs. So viel einfacher und hält Ihre controller-Logik in der EJBs für klarere/sauberere Trennung und all die anderen Nettigkeiten wie CMTs etc.@Stateless
Anmerkung, aber in diesem Fall produzierenden Bereich muss statisch sein:private static EntityManager em;
im MyProducers KlasseEigentlich nicht.
@PersistenceContext
annotation verwendet werden können, in CDI und ist nicht verbunden mit EJB. Können Sie etwas wie das hier tun:EJB verwendet
@EJB
Kommentar zu injizieren anderen EJB, aber es gelingen kann, jede CDI-bean oder Persistenz-Kontext mit gleichen Anmerkungen.