Inject EJB bean из JSF управляется bean программно

У меня EJB безстоящий bean.
Как я могу вставить его в управляемый JSF bean программным вместо аннотации @EJB?

Ответ 1

Вы не можете вводить его программно. Однако вы можете получить его программным путем. EJB также доступны через JNDI. Обычно вы находите эти имена/псевдонимы JNDI, напечатанные в журнале запуска сервера. По крайней мере, JBoss/WildFly делает это.

Существуют разные псевдонимы псевдонимов JNDI:

java:global/APP_NAME[/MODULE_NAME]/EJB_NAME
java:app/MODULE_NAME/EJB_NAME
java:module/EJB_NAME

Где /APP_NAME - имя приложения WAR или EAR, а /MODULE_NAME - это имя модуля EJB в случае приложения EAR или WAR-модуль в случае приложения с одной WAR (и это будет отсутствовать в java:global, поскольку он в противном случае повторяет /APP_NAME), а /EJB_NAME по умолчанию - имя класса класса EJB.

java:global доступен через весь сервер. java:app доступен только из одного приложения (WAR или EAR). java:module доступен только изнутри того же модуля (EJB в случае EAR или WAR в случае одной-WAR).

Управляемый JSF bean, очевидно, находится внутри WAR. Если у вас есть приложение для одной WAR, тогда java:module/EJB_NAME должен работать. Если у вас есть проект EAR, то EJB, очевидно, находится внутри модуля EJB, в этом случае java:module не будет работать, и вам понадобится java:app или java:global.

Итак, учитывая EJB, как показано ниже,

@Stateless
public class FooService {}

в проекте с одной-WAR с именем "foo_war" через JNDI, доступным в управляемом JSF bean следующим образом (обычно вы делаете это в методе @PostConstruct):

InitialContext jndi = new InitialContext();

FooService fooService = (FooService) jndi.lookup("java:module/FooService");
// Or
FooService fooService = (FooService) jndi.lookup("java:app/foo_war/FooService");
// Or
FooService fooService = (FooService) jndi.lookup("java:global/foo_war/FooService");

или в проекте EAR с именем "foo_ear" с модулем EJB с именем "foo_ejb" с ним в классе EJB (в то время как управляемый JSF bean находится в модуле WAR проекта EAR):

InitialContext jndi = new InitialContext();

FooService fooService = (FooService) jndi.lookup("java:app/foo_ejb/FooService");
// Or
FooService fooService = (FooService) jndi.lookup("java:global/foo_ear/foo_ejb/FooService");