単純なJavaクラス内でリモートエンタープライズBeanにアクセスする

StackOverflow https://stackoverflow.com/questions/1620803

  •  06-07-2019
  •  | 
  •  

質問

これが私の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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top