从 Servlet 远程查找另一个 Glassfish

Remote lookup to another Glassfish from a Servlet

我正在尝试 运行 从 Servlet 远程查找另一个 Glassfish。所以,我一直在关注 link 文档 (http://docs.oracle.com/cd/E19798-01/821-1752/beanv/index.html)。首先,我创建了一个名为 CalculatorBean 的 Sateless Session Ben,打包在同名的 EJB JAR(CalculatorBean)中,JNDI 名称为 java:global/CalculatorBean/CalculatorBean.

根据文档,我创建了一个 Web 项目并在子web.xml以下文件中声明了我的 EJB:

<ejb-ref>
      <ejb-ref-name>ejb/CalculatorBean</ejb-ref-name>
      <jndi-name>corbaname:iiop:127.0.0.1:3700#CalculatorBean/CalculatorBean</jndi-name>
  </ejb-ref>

其中127.0.0.1为本机主机(本地!),3700为默认查询端口,CalculatorBean/CalculatorBean为全局JNDI名称。第一个问题,理论上 JNDI 名称传递到可互操作的字符串 "CalculatorBean/CalculatorBean" 而不是 "java: global/CalculatorBean/CalculatorBean",对吗?

之后,我创建了一个 Servlet 并放入了以下代码片段:

ctx = new InitialContext ();
bean = (CalculatorRemote) ctx.lookup ("java:comp/env/ejb/CalculatorBean");

其中,CalculatorRemote 是我们包含在 java 项目中的远程接口的名称:comp/env/ 是访问 Java EE 组件和 ejb/CalculatorBean是我的bean在sun-web.xml文件的配置中的名字 当放入 运行 我的 Servlet 时出现异常:

Caused by: javax.naming.NameNotFoundException: No object bound to name java:comp/env/ejb/CalculatorBean

很明显,它没有找到名称,但是,我真的不知道我应该使用什么名称来设置查找。

我遇到了同样的问题,我解决了。

默认情况下,您的 EJB 在 java:comp/env/ 中不可见,并且您无法在 InitialContext 实例中查找 EJB。但是,在使用 @EJB 注释注入至少一个 EJB 实例之后,您可以成功查找 EJB,例如,例如:

@EJB(name = "ejb/CalculatorBean")
private CalculatorRemote calc;

之后,CalculatorRemote EJB 在 InitialContext 实例中可见。