2011-11-17 19 views
9

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ビルドではクラスのプロデューサフィールドが必要です。これがどうして起こるか説明できません。すべての最終的な展開が多かれ少なかれ同等でなければならないのですが、そうではありませんか?

+0

Webブラウザ:この後、それ以上...

階層化が存在しますEJBをインジェクトしようとしましたが、同じEJB Jarまたは別のアーカイブにありますか?注意:Beanディスカバリ(またはCDI)を有効にするにはbeans.xmlが各デプロイメントアーカイブに存在する必要があります。 .warsの場合はWEB-INF、.jarsの場合はMETA-INF – stratwine

+0

はい。どちらもbeans.xmlを持っています。 –

+0

プロジェクトをAntビルドに変換しようとしました。すべて今はうまくいく。私はもう戦争モジュールとejbモジュール用の別々のプロデューサーを作る必要はありません。今の質問です:Mavenのアーキタイプに問題はありますか?それとも特別な注意点がありますか? –

答えて

0

@ NamedをEjbArtifactProducerに入れてみてください。また、生産がこの種のシンプルなものであれば、それを削除する方が良いと思います(そうしないともう一度変更する必要があります)。

1

@Injectを使用する場合は、@Named @ApplicationScopedと注釈を付けてください。そうでない場合は、シングルトンを注入するときに@EJBを使用してください。

0

何がうまくいかないのか分かりにくいですが、私たちにとって間違っていたのは、クラスローダー境界の間でCDIを使用することです。たとえば、アプリケーションがearファイルとしてパッケージ化されている場合は、jarファイル内のejbsとwarファイル内のwebappを使用します。この場合、CDIを使用してWeb層にejbsを挿入することはできません。問題は、jarファイルとwarファイルが異なるクラスローダーによって読み込まれるということです。おそらく、新しいCDI実装は異なる動作をしますが、少なくともJBoss 6とGlassfishはこの問題を抱えていました。

1

ジョーダンデニソンが正しいです。 @InjectとEJBを試していますが、EJBの場合は@EJBを使用しています。あなたはおそらく@Statelessまたは何かで注釈されているEJBクラスです。 @Injectは、@Namedと注釈が付いたセッションBeanで使用する必要があります。

0

JSFのバッキングBeanとしてCDIを使用します。 (Web ContainerのCDI)を使用し、ビジネスレイヤーでEJBとJPAを使用します.CDIレイヤーは特定のビジネスメソッドを呼び出すためにEJBを挿入できます。

この場合、懸念事項は明確に分離されています。

BTW:EJBインターフェイスはまったく必要ありません。リモートから通信するための要件が​​ある場合は、インターフェイスのみを使用してください(@リモート)。 @LocalBeanアノテーションを使用すると、EJB自体を直接注入することができます。

もしあなたが自分の懸念を払ってレイヤーをきれいに分離しているとすれば、このNullPointerExceptionの理由を見つけるのがよいと思います。あなたのNullPointerExceptionはありません> JSFにfacelet - - > CDIバッキングBean - > [EJBサービス(S) - > EntityManagerを別の

+0

インターフェイスに関する興味深いリンク - > http://www.adam-bien.com/roller/abien/entry/how_to_deal_with_interfaces – StefanHeimberg

関連する問題