我有一个 EJB bean,它暴露给如下两个接口(interface):本地接口(interface)用于我的 Web 应用程序,远程接口(interface)用于我的应用程序客户端
@Stateless
public class CoreMainEJB implements CoreMainEJBRemote, CoreMainEJBLocal {
//...
}
所以我的 App Client 如下所示。在这种情况下发生了远程方法调用
public class Main {
@EJB
private static CoreMainEJBRemote coreEJBRemote;
public static void main(String[] args) {
coreEJBRemote.process(args[0]);
}
}
从我的网络应用程序中,我调用如下。在这种情况下发生了本地方法调用
@ManagedBean
@RequestScoped
public class DisplayInbound {
@EJB
private CoreMainEJBLocal coreMainEJBLocal;
public void processPackages() {
coreMainEJBLocal.process(...);
}
}
所以这是我的问题,如果 EJB 只暴露了 @Remote 接口(interface),但在您的 Web 应用程序中,您直接注入(inject) EJB bean 而不是其 Remote 接口(interface),这会触发远程调用还是本地调用? 例如:
@Stateless
public class CoreMainEJB implements CoreMainEJBRemote{
//...
}
在网络应用程序中,我这样做
@EJB
private CoreMainEJB coreMainEJB;
public void processPackages() {
coreMainEJB.process(...); //Is this local or remote invocation here?
}
最佳答案
给出的最后一个示例根本行不通。由于CoreMainEJB
已经实现了远程接口(interface),容器将不是 创建一个无界面 View 。这正是 @LocalBean
的情况。旨在。
因此,要回答“这里是本地调用还是远程调用?”这个问题。直接:两者都不是。容器将无法注入(inject)任何东西,并且可能会在部署阶段吐出。
如果您将 bean 定义为:
@Stateless
@LocalBean
public class CoreMainEJB implements CoreMainEJBRemote{
//...
}
然后本地语义将在这里应用:
@EJB
private CoreMainEJB coreMainEJB;
public void processPackages() {
coreMainEJB.process(...); // Local semantics
}
(假设上面的代码片段与
CoreMainEJB
定义在同一个应用程序中)
关于jsf - 如果 EJB 暴露了 @Remote 接口(interface),但您注入(inject)的是 EJB bean 而不是其 Remote 接口(interface),这会触发远程调用还是本地调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6817793/