У меня EJB безстоящий bean.
Как я могу вставить его в управляемый JSF bean программным вместо аннотации @EJB?
Inject EJB bean из JSF управляется bean программно
Ответ 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");