这是我的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名称与servser的(Glassfish)实际JNDI名称不匹配,所以我通过其管理控制台(特定于供应商)检查了Glassish中的JNDI树,我做了请注意, NewSessionRemote 接口的JNDI(会话bean NewSessionBean 的业务接口)与我在应用程序端给出的名称不同。那么这是怎么发生的呢然后突然出现了一些问题,那就是 ejb-jar.xml 还有另一个名称JNDI名称分配给相同的 NewSessionRemote 使用标签。所以我只是删除它并重新部署EJB模块。就是这样。
答案 0 :(得分: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
上的简单示例答案 1 :(得分:0)
使用JNDI时,您使用的API需要在其下面进行特定配置才能连接到服务器(有关该配置的详细信息,请参阅Javadoc)。例如,java.naming.factory.initial
是指示您要使用的JNDI实现的属性。
现在,当在JavaEE服务器中运行代码时,此配置是隐式可用的,您需要做的就是在代码中完成的操作 - 实例化InitialContext
并执行查找。但是,在服务器外部运行时,此隐式配置不存在,因此您需要明确配置InitialContext
。
您的示例代码使用main()
方法,这表示您正在容器外运行。您需要的配置取决于您的特定应用程序服务器,您需要查找该文档以查看要提供的配置。