У меня 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");