У меня есть 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?