2010-11-28 73 views
1

J'ai essayé d'utiliser l'API struts 1.3 pour créer une petite application avec EJB 3.0. Malheureusement, je ne peux pas utiliser l'annotation @EJB pour appeler mon objet bean depuis l'intérieur de ma classe d'action. J'ai résolu ce problème en utilisant différentes solutions de contournement (la première consiste à utiliser mon nom jndi global de mon bean et l'autre à appeler une autre classe en premier et à utiliser l'annotation @EJB de cette classe). Encore ces deux solutions de contournement ont des inconvénients significatifs. Je voudrais appeler mon EJB directement depuis ma classe d'action. J'ai lu beaucoup d'exemples en utilisant le nom JNDI "java: comp/env/beanName" mais je n'ai toujours pas compris comment le faire et obtenir le nom introuvable axception. Laisser le nom complet de la classe EJB locale être le com.ejb.myEjbPackage.MyEJBLocal, comment puis-je l'appeler en utilisant la recherche contextuelle? (Puis-je le faire sans modifier les descripteurs web.xml et sun-web.xml?) J'utilise le serveur glassfish et l'IDE Netbeans.ne trouve pas mon bean en utilisant la méthode InitialContext.lookup()

Nous vous remercions à l'avance

Répondre

1

J'ai trouvé la réponse: Si vous ne pouvez pas utiliser l'annotation EJB dans la classe que vous voulez appeler la fève puis: Si vous ne voulez pas gâcher avec des descripteurs XML pour définir votre bean, vous devez le faire dans la classe des haricots elle-même. Par conséquent i utilisé l'annotation suivante dans la classe GameBean

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

Le beanName est facultative. L'annotation doit être déclarée dans la ligne AU-DESSUS de la déclaration de la classe. Ensuite, afin d'appeler le haricot de l'autre classe, vous pouvez le faire

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

@EJB ne fonctionnera pas dans un POJO standard, il ne peut se faire dans un objet géré (par exemple un autre bean session)

Alors ...

Voilà votre haricot

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

Voici votre recherche

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

Vous pouvez faire d'autres lectures sur le mappedName pour voir si vous voulez l'utiliser ou non.