在简单Java类中访问远程企业bean

在简单Java类中访问远程企业bean,java,ejb,jndi,Java,Ejb,Jndi,这是我的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();

这是我的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类都是根据EJB3.0标准编写的。 你的宝贵贡献是值得期待的

解决方案

例外是

javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found

发生这种情况是因为应用程序端提供的JNDI名称与Servers(Glassfish)的实际JNDI名称不匹配,所以我确实通过Glassish的管理控制台(特定于供应商)检查了JNDI树,并且我注意到用于NewSessionRemote接口的JNDI(这是会话bean的业务接口NewSessionBean)与我在应用程序端给出的名称不同。那么这是如何发生的呢?然后我突然想到了一个东西,那就是ejb jar.xml有另一个名称JNDI名称分配给同一个NewSessionRemote使用标记。所以我只需删除它并重新部署ejb模块。就是这样。

如果您没有RMI注册表(即活动服务器),您将
lookingUp()

您没有提供
Context.INITIAL\u Context\u FACTORY
变量,因此查找应该是有效的URL,而不是

因此,您应该在
env
上(在
iCtx
上)放置类似的内容:


我建议您阅读一下

上的简单示例,看起来您没有RMI注册表(即活动服务器),您正在查看
lookingUp()

您没有提供
Context.INITIAL\u Context\u FACTORY
变量,因此查找应该是有效的URL,而不是

因此,您应该在
env
上(在
iCtx
上)放置类似的内容:


我建议您在使用JNDI时阅读上面的简单示例,您使用的API需要其底层的特定配置才能连接到服务器(有关配置的详细信息,请参阅)。例如,
java.naming.factory.initial
是指示要使用哪个JNDI实现的属性

现在,当在JavaEE服务器内运行代码时,此配置隐式可用,您需要做的就是在代码中执行的操作—实例化
InitialContext
,并执行查找。但是,当在服务器外运行时,此隐式配置不存在,因此您需要配置
InitialContext
显式


示例代码使用了
main()
方法,这表明您正在容器外运行。您需要的配置将取决于您的特定应用程序服务器,您需要查阅该文档以查看要提供的配置。

使用JNDI时,您使用的API需要其底层的特定配置才能连接到服务器(有关该配置的详细信息,请参阅)。例如,
java.naming.factory.initial
是指示要使用哪个JNDI实现的属性

现在,当在JavaEE服务器内运行代码时,此配置隐式可用,您需要做的就是在代码中执行的操作—实例化
InitialContext
,并执行查找。但是,当在服务器外运行时,此隐式配置不存在,因此您需要配置
InitialContext
显式


示例代码使用了
main()
method,这表明您正在容器外运行。您需要的配置将取决于您的特定应用程序服务器,您需要查阅该文档以查看要提供的配置。

Hi我确实成功地克服了这个问题,但现在我得到了另一个例外Hi我确实成功地克服了这个问题,但现在我I’我得到了另一个例外问题已经解决,谢谢你的帮助。那么,你发布一些关于解决方案的详细信息,以便其他具有相同问题的人能够从你的经验中学习如何?问题已经解决,谢谢你的帮助。那么,你发布一些关于解决方案的详细信息,以便其他具有相同问题的人能够从中学习如何你的经历?
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");