1

これが私の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 モジュールを再デプロイします。それでおしまい。

4

2 に答える 2

1

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で簡単な例を読むことをお勧めします

于 2009-10-25T12:45:53.797 に答える
0

JNDI を使用する場合、サーバーに接続するために、その基盤となる特定の構成を必要とする API を使用しています (構成の詳細については、Javadocを参照してください)。たとえば、java.naming.factory.initial使用する JNDI の実装を示すプロパティです。

現在、JavaEE サーバー内でコードを実行する場合、この構成は暗黙的に利用可能であり、必要なのはコードで実行したこと、つまりインスタンス化InitialContextしてルックアップを実行することだけです。ただし、サーバーの外部で実行する場合、この暗黙的な構成は存在しないため、InitialContext明示的に構成する必要があります。

サンプル コードではmain()、コンテナの外部で実行していることを示唆するメソッドを使用しています。必要な構成は、特定のアプリケーション サーバーによって異なります。そのドキュメントを調べて、提供する構成を確認する必要があります。

于 2009-10-25T12:47:24.247 に答える