Je suis le livre MasteringEJB4thEdition, que j'ai téléchargé sur le site Web de Server Site.Liaison de noms JNDI dans JBOSS 5.1.0 Beta
Il existe un exemple simple de HelloBean, qui fonctionne parfaitement avec le serveur d'application GlassFish V3. Le même exemple lors du déploiement sur JBOSS échoue en raison de la recherche de nom JNDI.
Existe-t-il une règle sur la façon dont les noms de recherche JNDI dans JBOSS sont décidés si nous n'en fournissons pas? J'ai trouvé en googlant que c'est "ear-file-name/Bean-class-name/remote" mais ça ne marche pas pour moi.
Voici le haricot
1. package com.hardik.stateless;
2. import javax.ejb.Stateless;
3. import javax.ejb.Remote
4.
5.
6.
7.
8. @Stateless
9. @Remote(Hello.class)
10. public class HelloBean implements Hello {
11.
12. public String hello() {
13. System.out.println("hello()");
14. return "Hello, World!";
15. }
16.
17. }
Voici le client que je utilise:
1. package com.hardik.stateless;
2.
3. import javax.naming.Context;
4. import javax.naming.InitialContext;
5.
6.
7. /**
8. * This is an example of client code which invokes
9. * methods on a simple, remote stateless session bean
10. * @author hardik
11. *
12. */
13. public class HelloClient {
14.
15. public static void main(String[] args) throws Exception {
16.
17. Context ctx = new InitialContext();
18. // works for Glassfish
19. //Hello hello = (Hello) ctx.lookup("com.hardik.stateless.Hello");
20. // doesn't work for JBOSS
21. Hello hello = (Hello) ctx.lookup("hello-bean/HelloBean/remote");
22.
23. System.out.println(hello.hello());
24. }
25.
26. }
Voici l'erreur que je reçois lors de l'exécution du client
# $ wsrunclient.sh -Djava.naming.factory.initial=org.jnp.interfaces.NamingContextFactory -Djava.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces -Djava.naming.provider.url=jnp://localhost:1099 -cp "lib/hello-bean.jar:dist/hello-client.jar:/home/hardik/apps/jboss/client/*" com.hardik.stateless.HelloClient
# log4j:WARN No appenders could be found for logger (org.jnp.interfaces.TimedSocketFactory).
# log4j:WARN Please initialize the log4j system properly.
# Exception in thread "main" javax.naming.NameNotFoundException: hello-bean not bound
# at org.jnp.server.NamingServer.getBinding(NamingServer.java:771)
# at org.jnp.server.NamingServer.getBinding(NamingServer.java:779)
# at org.jnp.server.NamingServer.getObject(NamingServer.java:785)
# at org.jnp.server.NamingServer.lookup(NamingServer.java:396)
# at sun.reflect.GeneratedMethodAccessor260.invoke(Unknown Source)
# at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
# at java.lang.reflect.Method.invoke(Method.java:597)
# at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
# at sun.rmi.transport.Transport$1.run(Transport.java:159)
# at java.security.AccessController.doPrivileged(Native Method)
# at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
# at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
# at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
# at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
# at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
# at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
# at java.lang.Thread.run(Thread.java:619)
# at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
# at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
# at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
# at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
# at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:722)
# at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:682)
# at javax.naming.InitialContext.lookup(InitialContext.java:392)
# at com.hardik.stateless.HelloClient.main(Unknown Source)