2009-06-22 2 views
0

Я следую книге MasteringEJB4thEdition, которую я загрузил с сайта сайта сервера.JNDI Связывание имени в JBOSS 5.1.0 Beta

Существует простой пример HelloBean, который отлично работает с сервером приложений GlassFish V3. Тот же пример, когда развернуто на JBOSS, терпит неудачу из-за поиска имени JNDI.

Есть ли правило, как имена поиска JNDI в JBOSS решаются, если мы не предоставляем какие-либо? Я обнаружил, что в googling это «имя-уха-имя/Bean-class-name/remote», но это не работает для меня.

Вот боб


    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. } 

Здесь клиент я использую:


    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. } 

Здесь ошибка я получаю во время выполнения клиента


# $ 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) 

ответ

2

Я исправил проблему после поиска. Мне пришлось добавить информацию о пространстве имен в файл ejb-jar.xml.

Я изменил его от:

<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> 

Я нашел ответ здесь: http://www.jboss.org/index.html?module=bb&op=viewtopic&t=157022

0

Я не уверен в JBoss 5, но под JBoss 4 консоль JMX имеет MBean под названием JNDIView, в котором есть операции по сбросу ire дерево JNDI на консоль. Если это все еще есть в JBoss 5, вы сможете найти свой EJB там.

0

Я проверил представление jndi с помощью консоли jmx, компонент зарегистрирован только внутри страны, а не в глобальном JNDI. Я вижу следующее сообщение во время развертывания ...


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

я думаю, вы должны добавить Этот Properties в 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 
Смежные вопросы