我有一个包含三个模块的 EAR 应用程序:
- bean 位于“app-ejb”模块中
- 远程接口(interface)位于“app-remote”中
- 网络服务正处于“应用大战”
- app-ejb 和 app-war 使用 app-remote 作为库。
全部打包在“app.ear”中。
这工作正常,但现在我必须在 EAR 应用程序之外使用相同的 bean,并且注入(inject)不起作用。
我在app-ejb中有:
@Stateless
@LocalBean
public class Services implements ServicesRemote {
[...]
}
以及他在app-remote中的远程接口(interface):
@Remote
public interface ServicesRemote {
[...]
}
在我的应用程序 war 中,我可以毫无问题地注入(inject)远程bean:
@Stateless
@LocalBean
public class UseServices {
@EJB
private ServicesRemote services;
[...]
}
无论如何,在我的外部 ejb 应用程序中,作为独立部署并使用相同的 ejb-remote 作为库,如果我尝试像这样注入(inject)相同的 EJB:
@Stateless
@LocalBean
public class UseServicesFromAnotherApp {
@EJB
private ServicesRemote services;
[...]
}
Glassfish (4.1) 给我一个错误“Class [ Lcom/[...]/ServicesRemote; ] not found”。
这是预期的吗?如何正确注入(inject)远程bean?
最佳答案
注入(inject)不适用于远程接口(interface)。 “可注入(inject)”的 Bean 存在于容器的 JVM 内,并且可用于注入(inject)到同一应用程序内的其他 Bean。尽管应用程序可能位于同一个 JVM 中,但访问同一容器中另一个应用程序中的 Bean 也是如此。由于远程方法源自另一个 JVM 或另一个应用程序,因此不可能进行注入(inject)。您必须使用 JNDI 查找来获取对远程 bean 的引用。
根据个人喜好,我会远离 EJB 远程接口(interface),而会使用另一种“远程处理”技术,例如 REST。
关于java - 将远程 EJB 接口(interface)注入(inject)外部模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40346886/