java - 在简单的 Java 类中访问远程企业 Bean

标签 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();
            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 标准编写的。 期待您做出宝贵的贡献。

解决方案

异常(exception)是

javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found

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

最佳答案

看起来您没有lookingUp()针对的RMI注册表(即 Activity 服务器)。

您没有提供 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 上的简单示例

关于java - 在简单的 Java 类中访问远程企业 Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1620803/

相关文章:

ejb - @Stateless bean 和 @EJB 保证是唯一的 ejb 实例吗?

java - 与 EJB 的远程连接在本地主机上工作,但在 127.0.0.1 和另一台服务器上失败

jakarta-ee - Glassfish 自定义资源的 JNDI 查找失败

java - 访问已实现接口(interface)引用的枚举的注释

java - 如何制作方形框架布局?

ejb - 无法在 Websphere 8 上查找远程 EJB

java - 我的代码中的 JNDI 名称在哪里?

java - 如何为 private HashMap<String, HashSet<String>> hm; 编写 bytebuddy 代码?

java - 我该怎么办 session URL 很长,我无法附加 JSESSIONID=389729387392。解决方案是什么?

jpa - 如何识别@PreUpdate 中的 EJB 实体属性更改?