2010-11-28 12 views
1

Ich habe versucht, Struts 1.3 API zu verwenden, um eine kleine Anwendung mit EJB 3.0 zu erstellen. Leider kann ich die @ EJB-Annotation nicht verwenden, um mein Bean-Objekt aus meiner Action-Klasse heraus aufzurufen. Ich habe dieses Problem mit verschiedenen Problemumgehungen gelöst (die erste ist die Verwendung meines globalen jndi-Namens meiner Bean und die andere besteht darin, zuerst eine andere Klasse aufzurufen und die @ EJB-Annotation aus dieser Klasse zu verwenden). Diese beiden Problemumgehungen haben jedoch erhebliche Nachteile. Ich möchte meine EJB direkt von meiner Aktionsklasse aus anrufen. Ich habe viele Beispiele mit dem JNDI-Namen "java: comp/env/beanName" gelesen, aber ich habe immer noch nicht herausgefunden, wie man es macht, und man erhält die Namen nicht gefundene Abweichung. Der vollständige Name der lokalen EJB-Klasse lautet com.ejb.myEjbPackage.MyEJBLocal. Wie kann ich sie mithilfe der Kontextabfrage aufrufen? (Kann ich es tun, ohne einen der web.xml und sun-web.xml Deskriptoren zu ändern?) Ich benutze Glassfish Server und Netbeans IDE.kann meine Bean nicht mit der InitialContext.lookup() -Methode finden

Vielen Dank im Voraus

Antwort

1

Ich fand die Antwort: Wenn Sie die EJB-Anmerkung in der Klasse verwenden, können Sie die Bohne anrufen möchten, dann: Wenn Sie Ihr Bean nicht mit XML-Deskriptoren zu verwirren definieren möchten, müssen Sie es tun in der Bean-Klasse selbst. Daher verwendete ich die folgende Anmerkung in der Klasse GameBean

 @Stateless 
    @EJB(name="ejb/GameBean",beanInterface=GameBeanLocal.class,beanName="GameBean") 
    public class GameBean implements GameBeanLocal {..... 

Die BeanName ist optional. Die Annotation muss in der Zeile ÜBER der Deklaration der Klasse deklariert werden. Um dann die Bohne von der anderen Klasse aufzurufen, können Sie

 InitialContext ic = new InitialContext(); 
    ic.lookup("java:comp/env/ejb/GameBean"); 
tun
2

@EJB nicht in einem Standard-pojo funktioniert es nur in einem verwalteten Objekt durchgeführt werden kann (dh eine andere Session Bean)

So ...

hier Ihr Bean

@Stateless(mappedName="beanName") 
public class beanName implements beanNameRemote { 

Hier ist Ihre Lookup

Context context = new InitialContext(); //default lookup pulls from jndi properties file 
context.lookup("beanName"); 

Sie können den mappedName weiterlesen, um zu sehen, ob Sie ihn verwenden möchten oder nicht.