Внедрить удаленный EJB, используя @Inject, используя поиск JNDI (java: global / vs ejb: /) Wildfly10 - PullRequest
1 голос
/ 26 июня 2019

Я хотел бы знать, почему удаленная SLSB, внедренная через @Inject, работает, когда аннотация @Produces используется с аннотацией @EJB с поиском, содержащим путь JNDI, такой как java: global /, а не ejb: /

Я создал один файл WAR (ejb-test-v1.0.war) с зависимостью от jar (api.jar). Api.jar содержит бизнес-интерфейс, который реализован в WAR как @Remote (view). В моем пограничном слое (JAX-RS); Я внедряю бизнес-интерфейс с помощью аннотации @Inject и заставляю его работать; у меня есть отдельный @Produces в сочетании с поиском @EJB.

Если путь JNDI, указанный в поиске, начинается с 'ejb: /', я получаю исключение NULL-указателя при вызове конечной точки REST.

@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 (s) и отношения JNDI. Возможно, это не имеет практического значения.

Если ответ таков, что удаленный EJB работает в том же приложении на той же JVM (сервере приложений); поэтому он не очень далек и не имеет смысла; Затем создайте другое WAR-приложение, содержащее только конечную точку отдыха и код CdiFactory; Поиск JNDI с помощью 'ejb: /' также вызывает исключение NULL-указателя. Насколько я понимаю, два разных приложения, работающих на одной и той же JVM (сервере приложений), могут искать только EJB (ы) как удаленные.

Ваши идеи будут высоко оценены.

...