Внедрить EJB-компонент из управляемого JSF-компонента
У меня есть EJB без гражданства.
Как я могу внедрить его в управляемый компонент JSF программным способом вместо аннотации @EJB?
1 ответ
Вы не можете ввести это программно. Однако вы можете получить его программно. EJB также доступны через JNDI. Обычно эти имена / псевдонимы JNDI печатаются в журнале запуска сервера. По крайней мере, JBoss / WildFly делает это.
Существуют разные псевдонимы имен JNDI:
Java: глобальный /APP_NAME[/MODULE_NAME]/EJB_NAME
Java: приложение /MODULE_NAME/EJB_NAME
Java: модуль / 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 явно находится в 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, как показано ниже (обычно это делается в @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 находится в модуле 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");