2010-11-24 14 views
4

Kann @EJB in einem anderen EJB verwendet werden? Ich versuche das jetzt zu tun, und mein EJB endet mit null. Ich werde mein Problem in einem Beispiel skizzieren.EJB 3.1 - Verwendung von @EJB in einem EJB - ist das möglich?

@Stateless 
@LocalBean 
@Local(LoginServiceLocal.class) 
public class LoginService implements LoginServiceLocal {  

    public void createLogin(String email, String password) { ... } 
} 

@Stateless 
@LocalBean 
@Local(AccountServiceLocal.class) 
public class AccountService implements AccountServiceLocal { 

    @PersistenceContext(unitName = "accounts") 
    private EntityManager accountEntityManager; 

    @EJB 
    private LoginServiceLocal loginService; 

    public void createAccount(Account account, String email, String password) { 
     accountEntityManager.persist(account); 
     loginService.createLogin(email, password); 
    } 
} 

Ist diese Art von Sache möglich? Ich sollte auch erwähnen, dass ich einen eingebetteten Container (über EJBContainer) verwende, und ich suche den AccountService mit JNDI, aber wenn ich versuche, loginService.createLogin im AccountService aufzurufen, ist der loginService null (wird nicht initialisiert) @EJB).

Was versuche ich zu tun?

Danke.

+0

Dieser Code auf jeden Fall kompatibel ist. Möglicherweise treten Probleme bei der Bereitstellung auf. Überprüfen Sie daher, ob LoginService erfolgreich bereitgestellt wurde. Wenn Sie ein funktionierendes Beispiel eines EJB sehen möchten, der auf ein EJB über @EJB verweist, lesen Sie http://openejb.apache.org/3.0/injection-of-other-ejsb-example.html –

Antwort

2

Ja, es ist möglich.

Mit der @LocalBean-Annotation kann ein EJB eine No-Interface-Clientansicht bereitstellen, sodass Sie keine lokale Schnittstelle definieren müssen.

Auf der anderen Seite definiert die Annotation @Local die lokale Client-Schnittstelle einer Bean.

Wählen Sie eine der oben genannten Konfigurationsoptionen nicht beide.

Wenn Sie die Annotation @LocalBean verwenden möchten, löschen Sie die Annotation @Local, entfernen Sie das Schlüsselwort implements und injizieren Sie den Namen der Bean-Klasse mit der Annotation @EJB.

Wenn Sie die @Local-Annotation verwenden, löschen Sie sowohl @Local als auch @LocalBean-Annotationen und injizieren Sie die Bean mit der @ EJB-Annotation unter Verwendung des Schnittstellennamens.

+1

Beide sollten in Ordnung sein. Wenn es irgendetwas betrifft, dann ist es definitiv ein Fehler. –

1

Ja, ich habe gerade an meinem Code gearbeitet, der genau das tut. Es könnte ein Problem mit der Erstellung des EJBs sein. Ich habe es nur mit Injektion und nicht mit einem JNDI-Lookup gemacht.

0

Wenn Sie EJB3.1 verwendet werden, können Sie auch @Inject von CDI verwenden