CDI オブザーバー メソッドを持つシングルトン EJB (javax.ejb.Singleton バージョン。ため息) があります。これを 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 Bean を @ApplicationScoped Bean に変更すると、アプリは正常にデプロイされます。同様に、CDI イベント オブザーバー メソッドを削除すると、アプリケーションは正常にデプロイされます。EJBのトランザクション、スレッドセーフなどが必要なため、実際にはクラスをEJBシングルトンにする必要があるため、これを@ApplicationScoped POJOのままにしておくだけではあまり役に立ちません。ただし、問題は Singleton Bean に限定されているようには見えません。アノテーションを @Stateless および @Stateful に変更して実験したところ、同じ問題が発生しました。
これは Weld のバグであると思われます。おそらく、Weld と EJB はそのメソッドをプロキシする方法について争っています。おそらく、EJB はインターセプタ クラスを追加し、そのメソッドをラップしてスレッドの安全性を確保する必要があり、Weld は何かをしようとしています。他にイベントリスナーを機能させるには?
ここで何か誤解しているのでしょうか?EJB で CDI イベント ハンドラーを使用しないでください (その場合、glassfish からのエラー メッセージが改善されます)。それとも、これは実際には CDI または EJB 実装の単なるバグですか?