単純なJavaクラス内でリモートエンタープライズBeanにアクセスする
質問
これが私のJavaクラスです
import endpoint.NewSessionRemote;
import javax.naming.Context;
import javax.naming.InitialContext;
public class HelloClient {
public static void main(String[] args) {
try {
Context ctx = new InitialContext();
NewSessionRemote hello = (NewSessionRemote) ctx.lookup("endpoint.NewSessionRemote");
System.out.println(hello.stringChange(4));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
このクラスを実行すると、例外が発生します。
javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found
at com.sun.enterprise.naming.TransientContext.doLookup(TransientContext.java:216)
at com.sun.enterprise.naming.TransientContext.lookup(TransientContext.java:188)
at com.sun.enterprise.naming.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:74)
at com.sun.enterprise.naming.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:129)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
java.lang.NullPointerException
他のすべてのエンタープライズBeanクラスは、EJB 3.0標準に従って記述されています。 あなたの貴重な貢献が期待されています。
ソリューション
例外は
javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found
アプリケーション側から与えられたJNDI名が、サーバー(Glassfish)の実際のJNDI名と一致しなかったために発生します。そのため、管理コンソール(ベンダー固有)でGlassishのJNDIツリーを確認しました。 NewSessionRemote インターフェース(セッションBean NewSessionBean のビジネスインターフェース)のJNDIは、アプリケーション側で指定した名前とは異なることに注意してください。それでどうしてこれが起こったのか、突然 ejb-jar.xml というタグが思い浮かびました。タグを使用して同じ NewSessionRemote にJNDI名が割り当てられています。そのため、単純に削除してEJBモジュールを再デプロイします。それだけです。
解決
JNDIを使用している場合、サーバーに接続するために特定の設定が必要なAPIを使用しています( Javadoc (その構成の詳細について)。たとえば、 java.naming.factory.initial
は、使用するJNDIの実装を示すプロパティです。
現在、JavaEEサーバー内でコードを実行する場合、この構成は暗黙的に使用可能です。必要なのは、コードで実行したことです- InitialContext
をインスタンス化し、ルックアップを実行します。ただし、サーバーの外部で実行する場合、この暗黙的な構成は存在しないため、 InitialContext
を明示的に構成する必要があります。
サンプルコードでは、 main()
メソッドを使用しています。これは、コンテナの外部で実行していることを示しています。必要な設定は、特定のアプリケーションサーバーによって異なります。提供する設定を確認するには、そのドキュメントを参照する必要があります。
他のヒント
あなたが lookingUp()
に反対しているRMIレジストリ(つまりアクティブなサーバー)がないように見えます。
Context.INITIAL_CONTEXT_FACTORY
変数を指定しなかったため、ルックアップは有効なURLである必要がありますが、そうではありません。
したがって、 env
( iCtx
)に次のようなものを配置する必要があります。
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
http://java.sun.com/j2se/1.5.0/docs/guide/jndi/jndi-rmi.html