2009-06-22 4 views
0

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) 

Répondre

2

J'ai résolu le problème après la recherche. J'ai dû ajouter des informations d'espace de noms à mon fichier ejb-jar.xml.

je l'ai changé 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&op=viewtopic&t=157022

0

Je suis pas sûr à propos de JBoss 5, mais sous JBoss 4, la console JMX a un MBean appelé JNDIView, qui a des opérations pour vider l'ent ire arbre JNDI à la console. Si c'est toujours le cas dans JBoss 5, vous devriez pouvoir trouver votre EJB là-bas.

0

J'ai vérifié la vue jndi avec la console jmx, le bean est enregistré uniquement en interne, pas dans le 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: [email protected]{HelloBean} 

1

je pense que vous devez être ajoutez ce qui suit Properties 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