Bonjour à tous
J'ai un problème assez ennuyeux: L'exemple le plus bateau possible de communication vers un EJB depuis un client standalone ne fonctionne pas.
J'ai d'abord créé un EJB stateless bateau:
Auquel a été automatiquement adjoint une interface remote:
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 package test; import javax.ejb.Stateless; /** * Session Bean implementation class Say_Hello */ @Stateless(mappedName = "Say_Hello") public class Say_Hello implements Say_HelloRemote { // Default constructor. public Say_Hello() {} @Override public String sayHello() { return "Hello World"; } }
J'ai déployé tout ce joli monde sur le serveur, et j'ai vérifié via la console d'administration web de glassfish qu'il n'y avait pas de problème de déploiment. Ensuite je me suis inspiré de la FAQ de Glassfish et du tutoriel "Elvis meet Glassfish" pour créer un client standalone vraiment pas compliqué:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 package test; import javax.ejb.Remote; @Remote public interface Say_HelloRemote { public String sayHello(); }
Avec bien sûr dans le même package une jolie petite interface toute mignonne:
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 package example.rmiClient; import javax.naming.InitialContext; public class Client { public static void main(String[] args) throws Exception{ // GET INITIAL CONTEXT InitialContext ctx=new InitialContext(); // GET REFERENCE ON REMOTE INTERFACE Object o=ctx.lookup("Say_Hello"); Say_HelloRemote say_HelloRemote=(Say_HelloRemote)o; // TRY TO USE REMOTE INTERFACE String response=say_HelloRemote.sayHello(); System.out.println(response); } }
Je compile le client, et à l'éxécution, j'ai ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 package example.rmiClient; public interface Say_HelloRemote { public String sayHello(); }
Voila, donc ça plante sur le ctx.lookup, et je ne vois vraiment pas pourquoi. Y aurait-il un détail évident que j'aurais oublié? Au début je me suis dit que c'était peut être un problème de nom de package, mais à la réflexion, je ne vois pas pourquoi ça rentrerait en compte..
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 Exception in thread "main" javax.naming.NamingException: ejb ref resolution error for remote business interfacetest.Say_HelloRemote [Root exception is java.lang.ClassNotFoundException: test.Say_HelloRemote] at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:425) at com.sun.ejb.containers.RemoteBusinessObjectFactory.getObjectInstance(RemoteBusinessObjectFactory.java:74) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304) at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:414) at javax.naming.InitialContext.lookup(InitialContext.java:392) at example.rmiClient.Client.main(Client.java:12) Caused by: java.lang.ClassNotFoundException: test.Say_HelloRemote at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at com.sun.ejb.EJBUtils.getBusinessIntfClassLoader(EJBUtils.java:679) at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:348) ... 5 more
Je précise aussi qu'au début je n'étais pas passé par un objet o intermédiaire. Je l'ai rajouté pour être sûr que c'était bien le ctx.lookup qui faisait planter, et pas le cast de l'objet qu'il retourne..
Merci de vos réponses![]()
Partager