2009-06-22 30 views
0

我正在關注MasteringEJB4thEdition手冊,該手冊是從服務器站點網站下載的。JBOSS 5.1.0中的JNDI名稱綁定測試版

有一個HelloBean的簡單例子,它與GlassFish V3應用服務器完美配合。由於JNDI名稱查找,因此部署在JBOSS上的相同示例失敗。

如果我們不提供任何規則,JBOSS中的JNDI查找名稱是如何決定的,是否有任何規則?我發現雖然使用谷歌搜索是「ear-file-name/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控制檯有一個名爲JNDIView的MBean,它有操作來轉儲數據將JNDI樹連接到控制檯。如果JBoss 5仍然存在,那麼你應該能夠在那裏找到你的EJB。

0

我用jmx控制檯檢查了jndi視圖,這個bean只在內部註冊,而不是在全局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

我想在Client/log4j.properties你必須添加以下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