IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tomcat et TomEE Java Discussion :

[ EJB ] [ TOMCAT ] accès aux EJB depuis Tomcat


Sujet :

Tomcat et TomEE Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 48
    Points : 36
    Points
    36
    Par défaut [ EJB ] [ TOMCAT ] accès aux EJB depuis Tomcat
    Bonjour à tous,

    J'essaye d'acceder, depuis une Action (struts) d'un projet WEB déployé sous Tomcat 5, à un EJB contenu dans un .jar déployé sous JBoss 4 (donc client et EJB dans 2 machines virtuelles différentes).
    J'ai déjà essayé de plusieurs façons mais j'obtient 2 erreurs différentes selon la manière utilisée. La classe du home s'appele ConnexionHome, son nom JDNI est ejb/ConnexionHome (confirmé avec l'interface d'administration JBoss)

    J'ai d'abord essayer de récuperer le home de mon EJB en utilisant une classe utilitaire générée par MyEclipse "ConnexionUtil" qui contient la méthode getHome() dont le code est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public static com.plansactions.interfaces.ConnexionHome getHome() throws javax.naming.NamingException
       {
          if (cachedRemoteHome == null) {
                cachedRemoteHome = (com.plansactions.interfaces.ConnexionHome) lookupHome(null, com.plansactions.interfaces.ConnexionHome.JNDI_NAME, com.plansactions.interfaces.ConnexionHome.class);
          }
          return cachedRemoteHome;
       }
    private static Object lookupHome(java.util.Hashtable environment, String jndiName, Class narrowTo) throws javax.naming.NamingException {
          // Obtain initial context
          javax.naming.InitialContext initialContext = new javax.naming.InitialContext(environment);
          try {
             Object objRef = initialContext.lookup(jndiName);
             // only narrow if necessary
             if (java.rmi.Remote.class.isAssignableFrom(narrowTo))
                return javax.rmi.PortableRemoteObject.narrow(objRef, narrowTo);
             else
                return objRef;
          } finally {
             initialContext.close();
          }
       }
    J'ai ensuite essayé ceci en m'inspirant des nombreux posts traitant du sujet sur divers forum mais aussi du tutorial présent sur le site de sun:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Context initial = new InitialContext();
    Context myEnv = (Context)initial.lookup("java:comp/env");
    Object objref = myEnv.lookup("ejb/ConnexionHome");
    ConnexionHome home =
          (ConnexionHome) PortableRemoteObject.narrow(objref,
             ConnexionHome.class);
    et de nombreuses variante comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InitialContext initialContext = new InitialContext();
      Object objref = initialContext.lookup(ConnexionHome.JNDI_NAME);
      ConnexionHome home = (ConnexionHome)PortableRemoteObject.narrow(objref, com.plansactions.interfaces.ConnexionHome.class);
    En faisant cela j'obtient l'Exception suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    javax.naming.NameNotFoundException: Le Nom ejb n'est pas lié à ce Contexte
    
    J'ai ensuite essayé comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Hashtable props = new Hashtable();
      props.put(InitialContext.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
      props.put(InitialContext.PROVIDER_URL, "jnp://localhost");
      InitialContext initialContext = new InitialContext(props);
      ConnexionHome home = (ConnexionHome)initialContext.lookup(ConnexionHome.JNDI_NAME);
    et j'ai obtenu une autre Exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
    
    Mes questions sont:

    Bien que le code client qui essaye d'acceder à cet EJB tourne sur une machine virtuelle différente, puis-je me passer de la construction de la Hashtable permettant d'obtenir le contexte initial?
    Sinon comment construire cette Hashmap? Si le code ci-dessus est correcte, où se trouve la classe org.jnp.interfaces.NamingContextFactory? Est-ce un probleme de CLASSPATH?
    Y a-t-il des fichiers de configuration de Tomcat ou de JBoss à modifier?

    Pour faire court...comment récupérer le Home d'un ejb déployé sous JBoss à partir d'une Action Struts tournant sous Tomcat?

    Ce post est tres (trop) long et je remercie d'avance ceux qui auront eu le courage de le lire ,voir d'y apporter une réponse!

    Merci à tous.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Bonjour !
    Je te propose d'essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    java.util.Properties props = new java.util.Properties();
      props.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
      props.put("java.naming.provider.url", "jnp://localhost:1099");
      props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
      InitialContext initialContext = new InitialContext(props);
      ConnexionHome home = (ConnexionHome)initialContext.lookup(ConnexionHome.JNDI_NAME);
    La seule chose à vérifier c'est si JBoss et Tomcat tournent effectivement sur la même machine. Si ce n'est pas le cas, il faudrait changer "localhost" par l'adresse de la machine JBoss. Ce qui donnerait donc pour l'url :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    props.put("java.naming.provider.url", "jnp://<adress_machine_jboss>:1099");
    Sinon, on peut aussi ne pas avoir à créer un objet Properties (ou Hashtable) en ajoutant ces propriétés dans un fichier "jndi.properties" qui devra être disponible dans le classpath.
    Voilà, j'espère que ça va t'aider.
    SCJP 5 / SCBCD 1.3 Certified

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Merci pour ta réponse manblaizo, ta solution fonctionne.
    J'ai également du copier certain .jar de JBoss dans le repertoire \WEB-INF\lib de mon projet.

    Pour information, j'ai eu de nouveau une exception après avoir effectuer les changement dans mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    javax.naming.CommunicationException [Root exception is java.rmi.ServerException: 
    RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested excep 
    tion is: 
    java.net.MalformedURLException: no protocol: Files/Apache]
    Et après une prise de tête de plus j'ai trouver la solution: le répertoire racine de Tomcat, "Tomcat 5.0", contenait un espace! J'avais déjà eu un probleme similaire il y a quelques mois en installant Jacorb dans le repertoire Program Files, qui m'avais aussi valu quelques jours de prise de tête ... Depuis j'installe tout ce qui concernce Java dans c:\Java, mais j'avais pas fait tilt sur l'espace dans "Tomcat 5.0"...

    Encore merci pour ton aide.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 85
    Points : 81
    Points
    81
    Par défaut
    Salut,

    Pas curiosité, je voulais savoir à quoi resemble ton "url JNDI" contenu
    dans la variable ConnexionHome.JNDI_NAME ? Elle est plutot sous la
    forme ejb/ConnexionHome ou java:comp/bla/bla/bla ?

    J'ai un project qui tourne exactement avec la meme architecture que toi
    et je retrouve mes bean qu'en utilisant la syntaxe ejb/blabla alors
    que dans cetains tutoriaux y'a aussi la deuxième de donné ...

    Merci d'avance
    Xavier

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Les noms JNDI de mes EJB sont de type ejb/nomEJB.
    J'ai essayé aussi l'autre solution mais cela ne marchait pas.

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    J'ai le même soucis que Houbbba, à la différence que mon ejb se trouve sur Weblogic 8.1 sp5. Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    /**
     * Initialise le contexte
     */
    protected Context getInitialContext() throws Exception {
        Hashtable props = new Hashtable();
        props.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        props.put(Context.PROVIDER_URL, "t3://<adress_machine_weblo>:<port_console_weblo>");
        Context ctx = new InitialContext();
        return ctx;
    }
     
    /**
     * Récupère l'interface Home
     */
    protected InitialisationHome getHome() throws Exception {
        Context ctx = this.getInitialContext();
        Object o = ctx.lookup(ejb/Initialisation);
        InitialisationHome intf = (InitialisationHome) PortableRemoteObject.narrow(o, InitialisationHome.class);
        return intf;
    }
    Le message retourné au moment du lookup : Le Nom ejb n'est pas lié à ce Contexte.

    Quelqu'un aurait-il une idée de ce qui ne va pas ?

    Merci d'avance !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur d'accès aux EJB
    Par barfoo dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 28/02/2012, 14h17
  2. Définir des rôles pour l'accès aux EJB
    Par Invité dans le forum Glassfish et Payara
    Réponses: 6
    Dernier message: 21/08/2008, 22h07
  3. Frameset et accès aux filles depuis le parent
    Par jak0 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 24/05/2007, 10h17
  4. Réponses: 5
    Dernier message: 02/11/2006, 18h37
  5. [TOMCAT] acces aux page jsp dans un autre repertoire
    Par yanagiba dans le forum Tomcat et TomEE
    Réponses: 8
    Dernier message: 16/08/2005, 06h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo