0

The Server Site Web サイトからダウンロードした MasteringEJB4thEdition ブックに従っています。

GlassFish V3 アプリケーション サーバーと完全に連携する HelloBean の簡単な例があります。同じ例を JBOSS にデプロイすると、JNDI 名のルックアップが原因で失敗します。

JBOSS で JNDI ルックアップ名を指定しない場合、どのように 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)
4

3 に答える 3

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

于 2009-06-22T12:12:33.253 に答える
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
于 2013-03-21T18:24:25.817 に答える
0

JBoss 5についてはよくわかりませんが、JBoss 4では、JMXコンソールにJNDIViewと呼ばれるMBeanがあり、JNDIツリー全体をコンソールにダンプする操作があります。それがJBoss5にまだある場合は、EJBを見つけることができるはずです。

于 2009-06-22T08:59:00.103 に答える