将远程EJB接口注入外部模块

时间:2016-10-31 16:59:35

标签: java java-ee ejb

我有一个包含三个模块的EAR应用程序:

  • bean位于“app-ejb”模块
  • 远程接口位于“app-remote”
  • 网络服务处于“app-war”
  • app-ejb和app-war使用app-remote作为库。

所有内容都打包在“app.ear”中。

这工作正常,但现在我必须在EAR应用程序之外使用相同的bean,并且注入不起作用。

我在app-ejb:

@Stateless
@LocalBean
public class Services implements ServicesRemote {
  [...]
}

和app-remote中的远程接口:

@Remote
public interface ServicesRemote {
  [...]
}

在我的app-war中,我可以毫无问题地注入远程bean:

@Stateless
@LocalBean
public class UseServices {
  @EJB
  private ServicesRemote services;
  [...]
}

无论如何,在我的外部ejb应用程序中,如果我尝试像这样注入相同的EJB,则作为独立部署并使用相同的ejb-remote作为库:

@Stateless
@LocalBean
public class UseServicesFromAnotherApp {
  @EJB
  private ServicesRemote services;
  [...]
}

Glassfish(4.1)给我一个错误“Class [Lcom /[...]/ ServicesRemote;] not found”。

这是预期的吗?如何正确注入远程bean?

2 个答案:

答案 0 :(得分:2)

注射不适用于远程接口。可注射"的豆类存在于容器的JVM中,可以注入同一应用程序内的其他bean。虽然应用程序可能位于同一个JVM中,但同样适用于访问同一容器中另一个应用程序中的bean。由于远程方法源自另一个JVM或其他应用程序,因此无法进行注入。您必须使用JNDI查找来获取对远程bean的引用。

作为一个问题或个人品味,我会远离EJB远程接口,而是我会使用另一个"远程处理" REST等技术。

答案 1 :(得分:0)

问题可能是由许多热部署造成的,使得玻璃鱼不稳定。 当我重新启动glassfish时,我的代码开始正常工作(它实际上仍在工作)。

很抱歉发布此处而不尝试重新启动glassfish。