使用@Inject使用JNDI查找来注入远程EJB(java:global / vs ejb:/)Wildfly10

时间:2019-06-26 15:53:37

标签: java ejb-3.1 java-ee-7 wildfly-10 ejb-3.2

我想知道为什么当@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();
    }
}
  1. 为什么用JNDI路径'ejb:/'指定查找时,@ Produces注释在调用其余端点时会返回NULL指针?
  2. 当用'java:global /'指定查找时,为什么相同的代码有效(只需注释和取消注释CdiFactory.java中的代码)?
  3. @EJB注释使用哪种默认查找机制?

如果您问我为什么要这样做?只是为了了解CDI注入EJB与JNDI的关系。也许这没有实际价值。

如果答案是远程EJB在同一JVM(应用程序服务器)上的同一应用程序中运行;因此它不是很遥远,也没有任何意义;然后创建另一个仅包含其余端点和CdiFactory代码的WAR应用程序;使用'ejb:/'的JNDI查找也会引发NULL指针异常。据我了解,运行在同一JVM(应用程序服务器)上的两个不同的应用程序只能将EJB查找为远程。

您的见解将受到高度赞赏。

0 个答案:

没有答案