Liaison de nom JNDI dans JBOSS 5.1.0 bêta
Question
Je suis le livre MasteringEJB4thEdition, que j'ai téléchargé du site Web The Server Site.
Il existe un exemple simple de HelloBean, qui fonctionne parfaitement avec le serveur d'applications GlassFish V3. Le même exemple, lorsqu'il est déployé sur JBOSS, échoue à cause d'une recherche de nom JNDI.
Existe-t-il une règle régissant la décision des noms de recherche JNDI dans JBOSS si nous n'en fournissons pas? J'ai trouvé lors de la recherche sur Google que c'est "ear-nom-fichier / 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 j'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)
La solution
J'ai résolu le problème après une recherche. J'ai dû ajouter des informations sur les espaces de noms à mon fichier ejb-jar.xml.
je l'ai changé à partir de:
<ejb-jar>
<enterprise-beans>
</enterprise-beans>
</ejb-jar>
à:
1. <?xml version="1.0" encoding="UTF-8"?>
2. <ejb-jar version="3.0"
3. xmlns="http://java.sun.com/xml/ns/javaee"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6. http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
7. </ejb-jar>
J'ai trouvé la réponse ici: http://www.jboss.org/index.html?module= bb & amp = op = viewtopic & amp; t = 157022
Autres conseils
Je pense que vous devez être ajouté comme suit Propriétés
dans Client / log4j.properties
:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p
%c{1}:%L - %m%n
log4j.rootLogger=INFO, stdout
Je ne suis pas sûr de JBoss 5, mais sous JBoss 4, la console JMX dispose d'un MBean appelé JNDIView, qui permet de vider l'intégralité de l'arborescence JNDI sur la console. Si cela existe toujours dans JBoss 5, vous devriez pouvoir y trouver votre EJB.
J'ai vérifié la vue jndi avec la console jmx, le bean est enregistré uniquement en interne, pas dans le fichier JNDI global. Je vois le message suivant au moment du déploiement ...
12:15:44,016 INFO [JBossASKernel] Added bean(jboss.j2ee:ear=hello-bean.ear,jar=hello-bean.jar,name=HelloBean,service=EJB3) to KernelDeployment of: hello-bean.jar
12:15:44,048 INFO [SessionSpecContainer] Starting jboss.j2ee:ear=hello-bean.ear,jar=hello-bean.jar,name=HelloBean,service=EJB3
12:15:44,048 INFO [EJBContainer] STARTED EJB: com.hardik.mejb.HelloBean ejbName: HelloBean
12:15:44,048 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
12:15:44,078 WARN [WebServiceDeployerEJB] Ingore ejb deployment with null classname: org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData@bebe0782{HelloBean}