簡體   English   中英

在簡單的Java類中訪問遠程企業bean

[英]Accesing an remote enterprise bean within a simple Java class

這是我的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 ,另外一個名稱JNDI名稱是使用標簽分配給同一NewSessionRemote的 因此,我只需刪除它並重新部署EJB模塊。 而已。

看起來您沒有正在lookingUp() RMI注冊表(即活動服務器)。

您沒有提供Context.INITIAL_CONTEXT_FACTORY變量,因此查找應該是有效的URL,不是。

因此,您應該在env (在iCtx )上放置以下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上閱讀簡單的示例。

使用JNDI時,您使用的API需要在其基礎上進行特定配置才能連接到服務器(有關該配置的詳細信息,請參見Javadoc )。 例如, java.naming.factory.initial是指示您要使用哪個JNDI實現的屬性。

現在,當在JavaEE服務器中運行代碼時,此配置是隱式可用的,您所需要做的就是在代碼中完成的工作-實例化InitialContext並執行查找。 但是,當在服務器外部運行時,此隱式配置不存在,因此您需要顯式配置InitialContext

您的示例代碼使用main()方法,這表明您正在容器外部運行。 您所需的配置將取決於您的特定應用程序服務器,您需要查看該文檔以查看要提供的配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM