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

Inject of remote EJB interface into external module

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

全部打包在"app.ear".

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

我在 app-ejb 中有:

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

和他在 app-remote 中的远程接口:

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

在我的应用程序中-war 我可以毫无问题地注入远程 bean:

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

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

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

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

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

注入不适用于远程接口。 "injectable" 的 Bean 位于容器的 JVM 中,可用于注入同一应用程序中的其他 Bean。这同样适用于访问同一容器中另一个应用程序中的 bean,尽管应用程序可能位于同一 JVM 中。由于远程方法源自另一个 JVM 或另一个应用程序,因此注入是不可能的。您必须改用 JNDI 查找来获取对远程 bean 的引用。

根据个人喜好,我会远离 EJB 远程接口,而是使用另一种 "remoting" 技术,例如 REST。

这个问题可能是由一些热部署引起的,导致 glassfish 不稳定。 当我重新启动 glassfish 时,我的代码开始正常工作(它实际上仍在工作)。

很抱歉没有先尝试重启 glassfish 就在这里发帖。