我想知道为什么当@Produces注释与@EJB注释一起使用的查找包含JNDI路径(例如java:global /而不是ejb:/
)时,通过@Inject注入的远程SLSB为何起作用?我创建了一个具有jar依赖项(api.jar)的WAR文件(ejb-test-v1.0.war)。 api.jar包含一个业务接口,该业务接口在WAR中以@Remote(视图)的形式实现。在我的边界层(JAX-RS)中;我使用@Inject注释注入业务接口并使之工作;我有一个单独的@Produces和@EJB查找。
如果查找中提供的JNDI路径以'ejb:/'开头,则在调用REST端点时会收到NULL指针异常。
@Remote(Calculator.class)
@Stateless
public class RemoteCalculatorImpl implements Calculator {
@Override
public int add(int a, int b) {
return a + b;
}
}
public interface Calculator {
int add(int a, int b);
}
生产要注入的CDI豆
public class CdiFactory {
@Produces
@EJB(lookup = "ejb:/ejb-test-v1.0/RemoteCalculatorImpl!com.aizaz.samples.ejb.Calculator")
private Calculator calculator;
// @Produces
// @EJB(lookup = "java:global/ejb-test-v1.0/RemoteCalculatorImpl!com.aizaz.samples.ejb.Calculator")
// private Calculator calculator;
}
REST端点
@Path("remote")
public class RemoteEjb {
@Inject
Calculator calculator;
@GET
public Response invoke() {
return Response.ok().entity(calculator.add(10, 10)).build();
}
}
如果您问我为什么要这样做?只是为了了解CDI注入EJB与JNDI的关系。也许这没有实际价值。
如果答案是远程EJB在同一JVM(应用程序服务器)上的同一应用程序中运行;因此它不是很遥远,也没有任何意义;然后创建另一个仅包含其余端点和CdiFactory代码的WAR应用程序;使用'ejb:/'的JNDI查找也会引发NULL指针异常。据我了解,运行在同一JVM(应用程序服务器)上的两个不同的应用程序只能将EJB查找为远程。
您的见解将受到高度赞赏。