2016-08-04 28 views
0

Ich habe ein staatenloses DAO-EJB mit einer No-Interface-View, die von einer generischen abstrakten DAO-Klasse mit einer zusätzlichen Methode geerbt wird. So ist der Baum FooDAOBean <- extends GenericDAOImpl <- implements GenericDAOInterface (click here to see GenericDAO implementation - in der Verbindung ist es nicht eine abstrakte Klasse):@EJB Injection scheitert in einem Singleton für eine Bean ohne Interface-Sicht

@Stateless 
public class FooDAOBean extends GenericDAOImpl<ENodeFocus, Serializable>{ 

    @Override 
    public List<Foo> readAll() { 
     // do something... 
    } 
} 

und ich habe eine Initialisierung Bohne, die die Anwendung mit einigen Einträgen konfigurieren sollte: immer

@Singleton 
@Startup 
public class InitializationBean { 

    @EJB 
    FooDAOBean dao; 

    @PostConstruct 
    public void initialize() { 
     // do something 
    } 
} 

auf den Einsatz ich bin die Fehler:

WFLYNAM0059: Ressourcensuche, um nach Injektion fehlgeschlagen: env/shitstorm.beans.InitializationBean/dao

WFLYEE0046: Fehler beim Komponentensicht

instanziiert Wenn ich eine Remote-Schnittstelle implementieren und mit Anmerkungen versehen FooDAOBean mit @Remote(<RemoteInterface>.class) funktioniert es richtig. Aber ich möchte keinen Fernzugriff erlauben. Für mich ist es wichtig, dass FooDAOBean Methoden nur in der gleichen JVM (lokal) zugänglich sind. FooDAOBean und InitializationBean sind im selben EAR-Projekt, also sollte es funktionieren oder fehlt mir hier etwas? Hat es mit dem Singleton zu tun oder was passiert hier? Muss ich eine lokale Schnittstelle implementieren? Ich dachte seit EJB 3.0 brauche ich es nicht mehr. Danke vielmals! :)

Antwort

1

Beachten Sie, dass Ihr FooDAOBean eine Business-Schnittstelle über seine Oberklasse implementiert.

Die Oracle Java EE Tutorial heißt es:

Wenn die Bean-Klasse eine einzige Schnittstelle implementiert, dass Schnittstelle ist auf die Business Interface angenommen. Die Geschäftsschnittstelle ist eine lokale Schnittstelle, sofern sie nicht mit der Anmerkung javax.ejb.Remote versehen ist. Die Annotation javax.ejb.Local ist in diesem Fall optional.

So hat Ihre FooDAOBean tatsächlich eine lokale Schnittstellenansicht anstelle der No-Interface-Ansicht, die Sie erwarten.

Ich würde vorschlagen, Ihre Bean zu sth wie FooDAOBeanImpl umbenennen. Dann erstellen Sie eine Schnittstelle FooDAOBean, die von GenericDAOInterface erbt. Lassen Sie Ihre Session-Bean FooDAOBeanImpl jetzt die neue Schnittstelle implementieren und kommentieren Sie die Klasse mit @Local(FooDAOBean.class), um eine klar definierte @Local Schnittstellenansicht zu erhalten. Jetzt können Sie FooDAOBean wie erwartet injizieren.