Java EE 6とCDIを初めて使用しています。私はいくつかのチュートリアルと溶接資料を読みました。しかし、私の理解からうまくいくものはありませんので、私は助けが必要です。EJBのCDIインジェクションによりNullPointerExceptionが発生する
私は次のような状況があります。 IDEで提供されているmavenのアーキタイプを使用してNetBeans 7.0.1でJava EE 6アプリケーションを作成し、IDEから提供されているGlassFish 3.1にデプロイしました。
beans.xmlは、EJB jarのMETA-INFディレクトリにあります。
@Stateless
public class EjbArtifactProducer {
@PersistenceContext(unitName = "trackProfiler-PU")
private EntityManager em;
@EJB
private UserFacadeLocal userFacade;
@EJB
private AuthServiceLocal authService;
@EJB
private NewsEntryFacadeLocal newsEntryFacade;
@EJB
private RoleFacadeLocal roleFacade;
@EJB
private TrackCommentFacade trackCommentFacade;
@EJB
private TrackFacade trackFacade;
@EJB
private TrackTypeFacade trackTypeFacade;
@EJB
private WaypointFacadeLocal waypointFacade;
@Produces
public AuthServiceLocal getAuthService() {
return authService;
}
@Produces
public EntityManager getEm() {
return em;
}
@Produces
public NewsEntryFacadeLocal getNewsEntryFacade() {
return newsEntryFacade;
}
@Produces
public RoleFacadeLocal getRoleFacade() {
return roleFacade;
}
@Produces
public TrackCommentFacade getTrackCommentFacade() {
return trackCommentFacade;
}
@Produces
public TrackFacade getTrackFacade() {
return trackFacade;
}
@Produces
public TrackTypeFacade getTrackTypeFacade() {
return trackTypeFacade;
}
@Produces
public UserFacadeLocal getUserFacade() {
return userFacade;
}
@Produces
public WaypointFacadeLocal getWaypointFacade() {
return waypointFacade;
}
}
私はEJBアーティファクト(とのEntityManager)のためにプロデューサークラスとしてソリーに動作するクラスを作成している
は、私は上記のような方法でフィールドに直接@Producesのアノテーションを適用しようとしました。
ただし以下は、これは、ステートレスセッションEJBで行われている他のEJB@Inject
private NewsEntryFacadeLocal newsEntryFacade;
に何かを注入していませんが、私は私のビジネスのいずれかの方法でnewsEntryFacadeにアクセスしようとすると、NullPointerExceptionがスローされます。だから明らかに注入が起こっていないか、私の生産者がヌル参照を生成しています。
何か不足していますか?またははになりますCDI/Weldによればこの作品ですか?
奇妙なことに、@Iject EJBをWebアプリケーションの部分に@Injectしようとしましたが(これは私の.war内でプロデューサクラスのプロデューサクラスが必要でした。 。
編集:このプロジェクトは、Antビルド(NetBeansで生成)で動作します。 NetBeansが提供するMavenのアーキタイプに問題はありますか? Mavenのアーキタイプでは、warモジュールとejbモジュールの間にCDI注入に関する問題があるようです。 Webとejbモジュールで別々のプロデューサを作成した場合、Glassfishはインターフェイスの実装を区別できない2つの実装エラーが発生することを発見しました。しかし、Webモジュールでプロデューサを削除すると、WeldはWebモジュールのBeanに注入したいEJBを解決できないという不平を言います。また、Antビルドの場合、EJBはプロデューサなしで@Injectedすることができますが、Mavenビルドではクラスのプロデューサフィールドが必要です。これがどうして起こるか説明できません。すべての最終的な展開が多かれ少なかれ同等でなければならないのですが、そうではありませんか?
Webブラウザ:この後、それ以上...
階層化が存在しますEJBをインジェクトしようとしましたが、同じEJB Jarまたは別のアーカイブにありますか?注意:Beanディスカバリ(またはCDI)を有効にするにはbeans.xmlが各デプロイメントアーカイブに存在する必要があります。 .warsの場合はWEB-INF、.jarsの場合はMETA-INF – stratwine
はい。どちらもbeans.xmlを持っています。 –
プロジェクトをAntビルドに変換しようとしました。すべて今はうまくいく。私はもう戦争モジュールとejbモジュール用の別々のプロデューサーを作る必要はありません。今の質問です:Mavenのアーキタイプに問題はありますか?それとも特別な注意点がありますか? –