Я хотел бы знать, почему удаленная 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();
}
}
- Почему, когда поиск указан с путем JNDI 'ejb: /', аннотация @Produces возвращает указатель NULL при вызове конечной точки покоя?
- Почему тот же код работает, когда поиск указан с помощью 'java: global /' (просто закомментируйте и раскомментируйте код в CdiFactory.java)?
- Какой механизм поиска по умолчанию используется аннотацией @EJB?
Если вы спросите, почему я это делаю? Просто чтобы понять CDI инъекцию EJB (s) и отношения JNDI. Возможно, это не имеет практического значения.
Если ответ таков, что удаленный EJB работает в том же приложении на той же JVM (сервере приложений); поэтому он не очень далек и не имеет смысла; Затем создайте другое WAR-приложение, содержащее только конечную точку отдыха и код CdiFactory; Поиск JNDI с помощью 'ejb: /' также вызывает исключение NULL-указателя. Насколько я понимаю, два разных приложения, работающих на одной и той же JVM (сервере приложений), могут искать только EJB (ы) как удаленные.
Ваши идеи будут высоко оценены.