EJB not Found

nasix
EJB not Found

Salut,

J'utilise Netbeans 6.0.1 et GlassFish V2 pour faire des EJB3.

Voila donc j'ai créé une Session Bean dont voici le code :

@Stateless
public class MySessionBean implements MySessionBeanRemote, MySessionBeanLocal {
    public String getMessage() {
        return "Bonjour tout le monde !!";
    }
}

Quand j'appelle ce bean via une servlet (en local) via l'annotation @EJB, ça marche très bien, mais dès que je veux l'appeler via un client stand-alone, ça me donne tout le temps l'exception "EJB not found", voici le code source de mon application stand-alone :

        Context ctx = null;
        ctx = new InitialContext();
        MySessionBeanRemote tsr = (MySessionBeanRemote) ctx.lookup("mySessionBean");
        System.out.println("message = " + tsr.getMessage());

Je tiens juste à préciser que je travaille sur la même machine localhost et sous le port par défaut 3700, donc le fichier jndi.properties de la librairie appserv-rt sera suffisant pour le service JNDI.

Quand j'exécute mon application cliente, j'ai toujours l'exception suivante :

Quote:
Exception in thread "main" javax.naming.NameNotFoundException: mySessionBean not found

Merci de bien me faire profiter de vos expériences.

Niroken

Hello,

Ton exception vient du fait qu'il ne trouve pas
mySessionBean dans ton arbre jndi.

J'ai bossé un peu ss weblogic et la conf jndi était fournie dans
des fichiers xml inclus dans le classpath.

Dans le cas de ton appli cliente, il faudrait que tu vérifies si tu load bien
les fichiers de conf(.properties ou xml) qui contiennent les infos pour accéder à tes ejb.

Bonne chance,
Niroken

nasix

Salut,

Merci pour votre réponse Niroken, je voulais juste réctifier une chose, le bean que je cherche s'appelle MySessionBean et non pas mySessionBean (premier m en majuscule), c'était une faute de frappe lors de postage de mon problème et ce n'est pas la source du problème.

Pour votre proposition de solution je vais voir.
Merci.

nasix

Salut,

J'ai revu ce que j'ai comme propriété jndi, et je ne vois pas exactement le problème, je vous remercie de me préciser exactement ce que je dois vérifier dans ma configuration.

J'ai même éviter d'utiliser le fichier .properties, en passant à l'objet InitialContext un objet Properties contenant la configuration requise, mais en vain.

Je ne sais pas si je me trompe si je pense que l'objet n'est pas instancié au niveau du serveur d'application (ça reste une hypothèse).

Niroken

Hello,

Bon je 'tavoue que je part un peu dans le flou pcke, je n'ai pas
utilisé la même config que toi mais je vais essayer de t'indiquer
ce que j'ai compris:

Quand on déploie des ejb sur un serveur weblogic, on peut egalement
générer des clients qui peuvent appeller les ejb en remote.
C'est valable également pour les autres serveur d'appli.

Voici les fichiers de config générés par weblogic pour un appel à un
ejb donné:

ejb-jar.xml :

<session>
      <ejb-name>MyBeanSession</ejb-name>
      <home>fr.edf.erdsge.ejb.mybean.MyBeanSessionHome</home>
      <remote>fr.edf.erdsge.ejb.mybean.MyBeanSessionRemote</remote>
      <local-home>fr.edf.erdsge.ejb.mybean.MyBeanSessionLocalHome</local-home>
      <local>fr.edf.erdsge.ejb.mybean.MyBeanSessionLocal</local>
      <ejb-class>fr.edf.erdsge.ejb.mybean.MyBeanSession</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

weblogic-ejb-jar.xml :

<weblogic-enterprise-bean>
    <ejb-name>MyBeanSession</ejb-name>
    <stateless-session-descriptor>
    </stateless-session-descriptor>
    <enable-call-by-reference>true</enable-call-by-reference>
    <jndi-name>ejb.MyBeanSessionRemoteHome</jndi-name>
    <local-jndi-name>ejb.MyBeanSessionLocalHome</local-jndi-name>
  </weblogic-enterprise-bean>

Ici le lookup jndi va chercher la référence jndi dans weblogic-ejb-jar.xml
puis va faire le mapping dans ejb-jar.xml pour recuperer le nom de l'ejb
pour charger les classes qui vont bien.
Ces classes *remote et *local sont livrées dans le client.

J'espère que ca peut t'aider

Bonne chance,
Niroken

nasix

Merci Niroken,

J'utilise EJB3 avec les annotations et je ne pense pas que j'ai besoin de tout ce paramétrage.

nasix

Bonjour,

Yopppiiiii, J'ai trouvé le problème, il me fallait juste spécifier le mappedName de mon EJB,

Alors une ligne comme :

@Stateless(mappedName = "mySessionBean ")

Aurait dû faire l'affaire (Stateless ou Stateful selon ce qu'on veut)

Merci pour vos aides.