2012-11-06 7 views
6

@EJBアノテーションを使用したインジェクションは、EJBクラス、サーブレット、またはJSFマネージドBeanでのみ可能であることがわかっていますが、同時にいくつかのインスタンスを注入する必要がありますPOJOクラスのビジネスインタフェースは、私は、次のやって考える:POJOでのEJBインジェクションの使用

@EJB BusinessInterfaceLocal businessInterface; 

private void someMethod(){ 
    PojoInterface pojo = new PojoClass(this.businessInterface); 
} 

を管理し、私のJSFで

豆を、私のPOJOクラスで私は、このコンストラクタを持って

BusinessInterfaceLocal businessInterface;  

public PojoClass(BusinessInterfaceLocal businessInterface){ 
    this.businessInterface = businessInterface; 

    //The following throws a Null Pointer Exception 
    this.businessInterface.someMethodCall(); 
} 

べきではありませんその上記は正しく動作しますか? PojoClassのbusinessInterfaceオブジェクトはnullに評価され、したがってNULLポインタ例外がスローされます。

私が間違っていることを誰かが指摘してくれるのであれば、私は期待していました。

ありがとうございます。

+2

注入が正常に動作するためには、注入が起こるように@Statelessのようなクラスを宣言する必要があります。私たちが見ることができるようにクラス全体を提供することはできますか? – david99world

+0

問題はビジネス・インターフェースでは使用できません。別の場所で使用できますが、ステートレス・アノテーションで実際に注釈が付けられていて、実装されているインターフェースにはローカルで注釈が付けられますが、プレーンなクラスで –

+0

*正確に*は 'NullPointerException'がスローされますか?あなたが言っているライン上か、スタックのどこかで深いところにありますか? –

答えて

9

検証

は、それはEJBが注入される前に、あなたがPojoClassを作成することが可能です。それは私が意味するところでは、どこで "someMethod"を呼び出しますか?それはマネージドBeanのコンストラクタにありますか?変数は単に参照される値を失うことはありません。

Managed BeanでBusinessInterfaceLocalbeanがnullでないことがわかりました。確認後にPojoを作成したことを確認できますか?

代替ソリューション:

ソリューション1 あなたは、ステートレスBeanとしてPOJOを使用することができ、もちろん、あなたが外にPOJOを使用しようとしている場合を除き、私は、それを行うには何の問題も表示されませんあなたのEEコンテナの見た目では、それはそうではありません。

POJOをステートレスにすると、EJBを注入できるようになります。以下のように実装さ

ソリューション2 OR JNDIルックアップ、:あなたは上記のコードで表示さ

@Stateless(name="myEJB") 
public class MyEJB { 

    public void ejbMethod() { 
    // business logic 
    } 

} 

public class TestEJB { 

    public static void main() { 
    MyEJB ejbRef = (MyEJB) new InitialContext().lookup("java:comp/env/myEJB"); 
    ejbRef.ejbMethod(); 
    } 
} 
1

を、NullPointerExceptionが示されたラインでスローすることができることを唯一の方法は、場合businessInterfaceフィールドですマネージドBean内の値はnullです。あるオブジェクトから別のオブジェクトに渡すと、参照が不思議にnullになることはありません。また、PojoClassは変数がnullになるようなことはしません。デバッグやロギングを行い、コンストラクターが呼び出された時点でマネージドBean内のフィールドの値を決定的に決定することをお勧めします。それがnullの場合、問題はBeanへの注入であり、POJOとは関係ありません。それを修正する必要があります。

実際に表示される行よりも例外が発生している場合は、間違ったコンテキストでEJBプロキシを使用すると問題が発生する可能性があります。お分かりのように、EJBへの参照は通常、EJB自体への参照ではなく、メソッド呼び出しをEJBに渡す何らかの種類のプロキシへの参照です。プロキシが存在するため、コンテナは、トランザクションの開始、承認の確認などの作業を実行できます。プロキシは、EJBがマネージドBeanからアクセスされたときに利用可能な作業を行うために特定のコンテキストリソースを呼び出す必要があるかもしれませんが、POJOからは、これらのリソースが利用できない場合、NullPointerExceptionになる可能性があります。さて、マネージドBeanのリファレンスをPOJOに渡すだけでは、そのような状況に陥ることはほとんどありません。これは、別のスレッドからマネージドBeanにアクセスするようなことをした場合にのみ発生します。だから、おそらくこれはそうではありません!問題は、コンテナは、それが管理対象Beanをインスタンス化完了だ後にのみEJBを注入しながら、私は、コンストラクタでbusinessInterfaceオブジェクトを使用しようとすることで引き起こされた

+0

その時点でマネージドBeanでヌルですか? –

+0

あなたが示したコードでは、それは起こり得ません。あなたの前提を確認してください。 –

+0

私がこの問題をさらに調査することを可能にして、できるだけ早くあなたのところに戻ってきますが、あなたが言っていることが最も合理的であると確信しています –

0

、同様の質問https://stackoverflow.com/a/6537228/1249304

参照何私はメソッドを作成し、@PostConstructアノテーションで注釈を付けました。この方法では、コンテナがマネージドBeanのインスタンス化を行った後、注釈付きメソッドが呼び出され、businessInterfaceオブジェクトはnullになりません。

@PostContsruct 
public void onInit(){ 
    //businessInterface is no longer null 
    businessInterface.someMethod(); 
} 
関連する問題