Упаковка EJB-компонентов на сервере Java EE - PullRequest
1 голос
/ 31 декабря 2010

Я развернул корпоративное приложение в EAR и отдельное веб-приложение в WAR (вне EAR) на том же сервере Java EE.

Вопрос: могу ли я получить доступ к локальному интерфейсу сессионного компонента в EAR из автономной WAR? Если да, могу ли я использовать внедрение зависимостей (DI)?

Ответы [ 2 ]

4 голосов
/ 01 января 2011

В разделе 3.2.2 спецификации EJB 3.1 прямо указано, что это не переносимо:

Доступ к корпоративному бину через требуется только локальный просмотр клиента поддерживаться для локальных клиентов упакованы в одном приложении как корпоративный бин, который обеспечивает вид локального клиента. уступчивый реализации этой спецификации может дополнительно поддерживать доступ к взгляд локального клиента на предприятие бин от локального клиента, упакованного в другое приложение. требования к конфигурации для межприкладной доступ к местному вид клиента зависит от поставщика и выходят за рамки этого Спецификация. Приложения, полагающиеся на межприкладной доступ к местному представление клиента непереносимо.

Как правило, для решения потребуется как минимум:

  1. Некоторый механизм, позволяющий загрузчикам классов EAR и WAR иметь видимость для одного и того же класса интерфейса.
  2. Какой-то механизм поиска локального интерфейса из другого приложения. Например, java: global.
1 голос
/ 01 января 2011

В любом случае, ответ на оба ваших вопроса: да .

Поскольку слух и война находятся в одной и той же JVM, можно использовать локальный интерфейс.Чтобы получить экземпляр сессионного компонента, вы должны использовать global JNDI name указанного компонента для выполнения поиска JNDI или использования со свойством mappedName в аннотации @EJB.Эти имена стандартизируются с помощью следующего шаблона:

java:global[/<app-name>]/<module-name>/<bean-name>[!<fully-qualified-interface-name>]

Таким образом, поиск будет, если имя вашего уха - my_app, вашим компонентом - MyBean.java, а его локальный интерфейс - com.foo.SomeBeanLocal:

InitialContext ctx = InitialContext();
SomeBeanLocal someBean = (SomeBeanLocal) ctx.lookup("java:global/my_ear/SomeBean/com.foo.SomeBeanLocal");

Инжекция будет:

public SomeManagedClass {

    @EJB(mappedName="java:global/my_ear/SomeBean/com.foo.SomeBeanLocal")
    SomeBeanLocal someBean;
}

Однако возможны две ловушки:

Нестандартное именование

Старая JavaРеализации EE (например, JBoss AS 5.1, Glassfish 2, Websphere) использовали свой собственный шаблон именования.Например, JBoss AS 5.x будет использовать:

<app-name>/<bean-name>/local|global

Например, с теми же именами, что и в предыдущем примере, глобальное имя JNDI этого компонента в JBoss AS 5.1 будет:

my_app/MyBean/local

Как уже говорилось, другие старые серверы приложений могут использовать другие имена.

Порядок запуска

Особенно при инъекции вы должны как-то заверить, чтоприложение, из которого вы хотите внедрить, было запущено до приложения, в которое вы хотите внедрить.Т.е. в вашем случае EAR был запущен до отдельной WAR.Для этого нет стандартных механизмов.Возможно, вам просто повезло, что он оказался в правильном для вас порядке.На этот порядок могут влиять отметки времени, алфавитный порядок имен приложений или что-то еще.

JBoss AS, например, использует теги <depends> во многих своих проприетарных файлах конфигурации, что идеально подходит для этого.хотя может быть трудно определить, от чего именно вам нужно зависеть (синтаксис может быть очень загадочным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...