У меня есть фасоль без EJB.
Как я могу внедрить его в управляемый компонент JSF программным вместо аннотации @EJB?Inject EJB bean из управляемых программ JSF программно
ответ
Вы не можете вводить его программно. Однако вы можете получить его программным путем. EJBs are also available via 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).
Управляемый bean JSF, очевидно, находится внутри 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");
Спасибо BalusC, это видно больше, чем я ожидал! – phanhongphucit
Добро пожаловать. – BalusC