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: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
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(); } }et de nombreuses variante comme:
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);En faisant cela j'obtient l'Exception suivant:
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);J'ai ensuite essayé comme ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 javax.naming.NameNotFoundException: Le Nom ejb n'est pas lié à ce Contexteet j'ai obtenu une autre Exception:
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);Mes questions sont:
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]
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.
Partager