2016-06-12 20 views
0

Ich arbeite an einem Projekt, wo ich EJB getrennt habe, so dass sie nur die Geschäftslogik ausführen, aber nicht die Abfragen durchführen. Dann habe ich auch die DAOs, die die Abfragen durchführen. Für mich ist die DAOs zu verwenden, habe ich die DAOs im EJB und mit einem Verfahren kommentierte @PostConstruct injizieren, stelle ich die EntityManager in der DAO mit den EntityManager in der Bohne injizierte wie unten:Wie man Entity Manager übergeben injected in statelesbean zu dao ohne Setter-Methode

public class ClazzDao implements ClazzDaoI{ 

    private EntityManager em; 

    public void setEm(EntityManager em){ 
    this.em = em; 
    } 

    public List<Entity> list(){ 
     return em.createQuery("FROM Entity e").getResultList(); 
    } 

} 

Und die EJB

Gibt es eine Möglichkeit, dass ich die DAOs dazu bringen kann, den im EJB injizierten Entity Manager zu verwenden, ohne ihn am @ PostConstruct des EJB zu setzen?

+1

Warum injizieren Sie den Entity Manager nicht direkt in die DAO, wo er benötigt wird, anstatt ihn in die Dienste zu injizieren, wo er nicht verwendet werden sollte? –

+0

Ich möchte EntityManager in der Bean injiziert verwenden und ich möchte nicht DAO als JavaBean auch verwenden. Und noch einmal, wenn ich es mit @PersistenceContext in das DAO injiziere, wird der Entity Manager bei der Verwendung null. – bavon

Antwort

2

Sie können die Funktion inject nur in container verwaltete Beans verwenden. Ihre DAO-Klasse ist außerhalb des Container-Managements nicht in der Lage, den EntityManager in dieses Objekt zu injizieren. Bringen Sie Ihre Klasse in das Container-Management (EJB/CDI), wenn Sie Injektionsfähigkeit benötigen. Übrigens vermeiden Sie unnötige Schnittstellen use non interface view instead.

0

Vergewissern Sie sich Sind Sie mit JAVA EE 6 oder höher, machen den ClazzDao als Bean Managed bedeutet entweder @ ApplicationScoped/@ SessionScoped

@ApplicationScoped public class ClazzDao implementiert ClazzDaoI

CDI kann ClazzDao ManagedBean injizieren .