3

私は Netbeans を使用しており、EJB を試しています。

私は 2 つのプロジェクトを持っています (2 つの別々のアプリケーション)

1- EnterpriseApp と呼ばれる Java ME プロジェクト

2- Test と呼ばれる標準 Java SE プロジェクト

ここで私が行ったことは次のとおりです。EnterpriseApp で、ローカル インターフェイスとリモート インターフェイスの両方を備えた TestEJB というステートレス EJB を生成しました。リモート プロジェクトの選択では、Test App を選択しました。要するに、Bean コードは次のようになります

@Stateless
public class TestEjb implements TestEjbRemote, TestEjbLocal 
{
    @Override
    public String Try() 
    {
        return "Hello World";
    } 
}

そして、Java SEクライアントプロジェクトでは、Beanにアクセスしようとしているメインクラスがここにあります:

public class Main 
{
    public static void main(String[] args) 
    {
        try 
        {
                Properties props = new Properties();
                props.load(new FileInputStream("jndi.properties"));
                InitialContext ctx = new InitialContext(props);
                TestEjbRemote testEJB = (TestEjbRemote) ctx.lookup("stateless.TestEjbRemote");
                System.out.println(testEJB.Try());
        } 
        catch (NamingException nex) 
        {
                nex.printStackTrace();
        } 
        catch (FileNotFoundException fnfex) 
        {
                fnfex.printStackTrace();
        } 
        catch (IOException ioex) 
        {
                ioex.printStackTrace();
        }
    }


}

これは JNDI.properties ファイルの内容です

java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
#optional.  Defaults to localhost.  Only needed if web server is running
#on a different host than the appserver
org.omg.CORBA.ORBInitialHost = localhost
#optional.  Defaults to 3700.  Only needed if target orb port is not 3700.
org.omg.CORBA.ORBInitialPort = 3700

そして、私はこのエラーを受け取ります

 TestEjbRemote testEJB = (TestEjbRemote) ctx.lookup("stateless.TestEjbRemote");

javax.naming.NamingException: Lookup failed for 'stateless.TestEjbRemote' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: stateless.TestEjbRemote not found]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at Main.main(Main.java:19)
Caused by: javax.naming.NameNotFoundException: stateless.TestEjbRemote not found
    at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:248)
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:215)
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77)
    at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:109)
    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.dispatchToMethod(ReflectiveTie.java:144)
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174)
    at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528)
    at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199)
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624)
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486)
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990)
    at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214)
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742)
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539)
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324)
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)

この問題を解決する方法について何か提案はありますか?

4

1 に答える 1

1

概念的には、すべてを正しく行いました。したがって、これは「間違った名前」に関連する問題であるはずです。

あなたがそれをチェックできるという良いニュース:)

アプリケーションサーバーに一度認識されたEJBがデプロイされます。これは、スタブが作成され、AS によって JNDI ツリーに配置されることを意味します。これは、サーバーが開始されると、JNDI ツリー ビューアー (通常はアプリケーション サーバーに付属しています) に移動して、何がどこにデプロイされているかを確認できることを意味します。ジャーを適切に設定していれば、これでうまくいくはずです。

お役に立てれば

于 2012-07-15T04:55:25.417 に答える