Внедрить 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");
Другие вопросы по тегам