Совместимы ли методы наблюдателя событий CDI с EJB? - PullRequest
8 голосов
/ 14 мая 2011

У меня есть Singleton EJB (версия javax.ejb.Singleton. Вздох), на котором есть метод наблюдателя CDI.Когда я пытаюсь развернуть это на glassfish 3.1, серверу не удается развернуть файл EAR без какого-либо реального объяснения - просто сказать, что во время развертывания произошла исключительная ситуация без каких-либо дополнительных подробностей.

SEVERE: Exception while loading the app
SEVERE: Exception while shutting down application container
....
SEVERE: Exception while shutting down application container : java.lang.NullPointerException

Это прослушиватель событий CDI:

public void updateFromGranule(@Observes @CloudMask GranuleAvailableEvent granuleEvent) {
    LOG.info("updating cloud map");
    update(granuleEvent.getGranule(), CloudMask.class);
    fireUpdate();
}

Если я изменю бин Singleton на бин @ApplicationScoped, приложение будет развернуто нормально.Точно так же, если я удаляю метод наблюдателя событий CDI, приложение развертывается нормально.Мне действительно нужно, чтобы класс был EJB-синглтоном, потому что я хочу транзакции, безопасность потоков и т. Д. Для EJB, так что просто оставить это как @ApplicationScoped POJO мне не очень полезно.Похоже, проблема не ограничивается компонентами Singleton - я экспериментировал, изменив аннотацию на @Stateless и @Stateful, и у меня возникла та же проблема.

Мне кажется, что это может бытьошибка в Weld, возможно, Weld и EJB борются из-за того, как они проксируют этот метод - предположительно, EJB должен добавить класс-перехватчик и обернуть этот метод для обеспечения безопасности потока, а Weld пытается сделать что-то еще, чтобы заставить прослушиватель событий работать?1009 *

Неужели я что-то здесь неправильно понимаю, и должны ли обработчики событий CDI просто не использоваться на EJB (в этом случае должны быть лучшие сообщения об ошибках из glassfish) - или это на самом деле просто ошибка в реализации CDI или EJB?

Ответы [ 2 ]

7 голосов
/ 16 мая 2011

Я думаю, что это ответ:

Методы-наблюдатели CDI должны быть либо статическими, либо объявленными в локальном интерфейсе EJB, если EJB объявляет локальный интерфейс.Обычно, если вы пытаетесь объявить метод наблюдателя, которого нет в локальном интерфейсе, вы получаете исключение от Weld, например:

org.jboss.weld.exceptions.DefinitionException: WELD-000088 Observer method must be static or local business method:  [method] public org.stain.ObserverBean.testMethod(EventClass) on public@Singleton class org.stain.ObserverBean

По какой-то причине glassfish не сообщает об этом исключении должным образом при загрузке моего файла EAR.и просто говорит Exception while loading the app.

Добавление метода в локальный интерфейс (или удаление объявления интерфейса в классе) устраняет проблему и позволяет приложению нормально загружаться.

3 голосов
/ 28 июня 2011

Я заметил ту же проблему с последней версией сварки.Но если вы добавите аннотацию @LocalBean, она будет работать с @Singleton и @Singleton @ Startup.

...