Кажется, что существует некоторая путаница между 3 вариантами развертывания:
- EAR, который включает в себя EJB и WEB-модуль
- Развертывание отдельного модуля EJB и отдельного модуля WEB
- Развертывание WEB-модуля, который включает в себя EJB-классы или EJB-файл.
В первой ситуации у вас логически одно приложение, но разделенное на два уровня. Модуль WEB изолирован от модуля EJB в том смысле, что он может использовать классы из модуля EJB, но модуль EJB не может использовать классы из модуля WEB. Поскольку это одно приложение, можно использовать локальный доступ к EJB-компонентам, и внедрение EJB-компонентов работает, как и ожидалось.
Во второй ситуации (на которую вы, похоже, ссылаетесь в своем вопросе) нет логического единого приложения, а на самом деле два отдельных модуля. Они работают в одной и той же JVM, но официально Java EE не позволяет использовать локальный доступ, и удаленный доступ должен использоваться (хотя практически локальный доступ часто работает в любом случае). Кроме того, внедрение EJB-компонентов в bean-компоненты в веб-модуле не работает напрямую с простой аннотацией @EJB
, но вместо этого должен использоваться атрибут lookup
, который задает глобальное имя JNDI.
Наконец, третья ситуация (о которой вы, кажется, не упоминаете, но упоминаете «домашний»), немного похожа на первую, но в этом случае нет уровней и изоляции. EJB-компоненты могут напрямую обращаться ко всем классам из остального веб-модуля.
Веб-профиль поддерживает только эту последнюю ситуацию развертывания. И EAR, и автономные развертывания EJB не поддерживаются.