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

Java 将远程EJB接口注入外部模块,java,jakarta-ee,ejb,Java,Jakarta Ee,Ejb,我有一个带有三个模块的EAR应用程序: bean位于“appejb”模块中 远程接口位于“应用程序远程”中 web服务处于“应用程序战争”中 appejb和appwar使用appremote作为库 所有这些都打包在“app.ear”中 这很好,但现在我不得不在EAR应用程序之外使用相同的bean,而注入不起作用 我有应用程序内ejb: @Stateless @LocalBean public class Services implements ServicesRemote { [...]

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

  • bean位于“appejb”模块中
  • 远程接口位于“应用程序远程”中
  • web服务处于“应用程序战争”中
  • appejb和appwar使用appremote作为库
所有这些都打包在“app.ear”中

这很好,但现在我不得不在EAR应用程序之外使用相同的bean,而注入不起作用

我有应用程序内ejb:

@Stateless
@LocalBean
public class Services implements ServicesRemote {
  [...]
}
以及应用程序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)给我一个错误“找不到类[Lcom/[…]/ServicesRemote;]


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

注入不适用于远程接口。“可注入”的bean存在于容器的JVM中,可注入到同一应用程序中的其他bean中。访问同一容器中另一个应用程序中的bean也是如此,尽管应用程序可能位于同一JVM中。由于远程方法来自另一个JVM或另一个应用程序,因此不可能进行注入。您必须使用JNDI查找来获取对远程bean的引用


无论是出于个人喜好,我都不会使用EJB远程接口,相反,我会使用另一种“远程处理”技术,如REST。

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


很抱歉,没有先尝试重新启动glassfish就在这里发布

你能发布整个日志错误吗?没有“整个错误日志”,我得到的唯一一行是:[2016-10-31T14:38:47.657-0300][glassfish 4.1][Severy][[global][tid:_ThreadID=43[u ThreadName=admin listener(3)][timeMillis:1477935527657][levelValue:1000][Class[Lcom/…/ServicesRemote;]找不到。加载时出错[class com…UseServicesFromAnotherApp]]我有很多使用远程接口的java EE应用程序,工作正常。事实上,您所写的是错误的,因为oracle文档中说“客户端访问实现远程业务接口的企业bean是通过依赖项注入或JNDI查找来完成的”这里-事实上,当我重新启动glassfish时,injection start可以正常工作,实际上它仍然可以正常工作。不是一个普通的Glashfish用户。我的理解是,只要应用程序同时包含ejb.jar和客户机(可能是另一个war、ejb模块等),就可以注入远程当你需要分离ejb和war模块时,如果你想让你的应用程序准备好,这是很有用的。