6

@EJBアノテーションを使用したインジェクションは、EJBクラス、サーブレット、またはJSFマネージドBeanでのみ可能ですが、同時に、POJOクラスにインジェクトされたビジネスインターフェイスのインスタンスが必要なので、次のことを考えました:

私のJSFマネージドBeanで

@EJB BusinessInterfaceLocal businessInterface;

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

私のPOJOクラスには、このコンストラクターがあります

BusinessInterfaceLocal businessInterface;    

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

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

上記は正しく機能しませんか?ただし、そうではありません。PojoClassのbusinessInterfaceオブジェクトはnullと評価されるため、nullポインター例外がスローされます。

私が間違っていることについて、誰かが私を指摘してくれるかどうかを望んでいました。

前もって感謝します。

4

3 に答える 3

11

検証

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

管理対象BeanでBusinessInterfaceLocalbeanがnullでないことがわかるとおっしゃいましたが、そのチェックの後にPojoを作成したことを確認できますか?

代替ソリューション:

解決策 1POJOをステートレスBeanとして使用できますが、もちろんEEコンテナーの外部でPOJOを使用しようとしている場合を除いて、問題はありません。 。

POJOをステートレスにすると、EJBを挿入できるようになります。

ソリューション2 または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();
  }
}
于 2012-11-06T11:29:15.463 に答える
1

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

スローされる例外が実際に表示されている行よりも深い場合は、間違ったコンテキストでEJBプロキシを使用すると問題が発生する可能性があります。ご存知かもしれませんが、EJBへの参照は通常、EJB自体への参照ではなく、メソッド呼び出しをEJBに渡すある種のプロキシへの参照です。プロキシは、コンテナが介入してトランザクションの開始や承認の確認などを実行できるようにするために存在します。プロキシは、EJBがマネージドBeanからアクセスされたときに利用できるが、いくつかの非自明でねじれた理由でPOJOからは利用できない作業を行うために、特定のコンテキストリソースを呼び出す必要がある場合があります。これらのリソースが利用できない場合、NullPointerException。さて、マネージドBeanからPOJOに参照を渡すだけで、そのような状況に陥る可能性は非常に低いと思います。これは、別のスレッドからマネージドBeanにアクセスするようなことをした場合にのみ発生します。だから、おそらくこれではありません!

于 2012-11-06T12:15:07.790 に答える
0

この問題は、コンストラクターでbusinessInterfaceオブジェクトを使用しようとしたことが原因で発生しましたが、コンテナーは、マネージドBeanのインスタンス化が完了した後にのみejbを注入します。

同様の質問への参照https://stackoverflow.com/a/6537228/1249304

私が行ったことは、メソッドを作成し、@ PostConstructアノテーションでアノテーションを付けたことです。これにより、コンテナーがマネージドBeanのインスタンス化を完了した後、アノテーションが付けられたメソッドが呼び出され、businessInterfaceオブジェクトはnullではなくなります。

@PostContsruct
public void onInit(){
   //businessInterface is no longer null
   businessInterface.someMethod();
}
于 2012-11-11T09:37:10.913 に答える