新しいEJB3.1仕様では、EJBをpojoに注入することは可能ですか?EJB 3.0では、@ EJBアノテーションを使用してEJBを挿入できることは知っていますが、これは単純なpojoでは機能しませんでした。
そうでない場合は、新しいキーワードを単純に使用することはできないことを知っているので、JNDIでBeanを検索する必要があります。
新しいEJB3.1仕様では、EJBをpojoに注入することは可能ですか?EJB 3.0では、@ EJBアノテーションを使用してEJBを挿入できることは知っていますが、これは単純なpojoでは機能しませんでした。
JSR-299(Java ContextsおよびDependencyI njection)を使用する場合、つまりPOJOがCDI管理対象Beanである場合、POJOへのEJBの注入が可能です。その場合、次のことができます。
@Inject MyEJB service
ただし、これはEJB 3.1の機能ではなく、CDIに由来します。また、CDIを使用していない場合は、ルックアップを実行する必要があります。
はい、JNDIルックアップを使用します。
POJOはあなたが作成したものであるため(私は推測します)、コンテナーは依存関係を注入する責任を負いません。
新しいEJB仕様(3.1)には、EJBのグローバルJNDI名を指定する機能が追加されています。これは、どこでも、どのBeanでも使用できることを意味します。
ただし、EJB 3.1コンテナはPOJOを認識しないため、明示的なJNDIルックアップを実行する必要があります。
私が推測している唯一の例外は、POJOが実際にアプリケーションクライアントである場合です。この場合、EJBを含むフィールドが静的であれば、@EJBアノテーションを適用できます。そのような場合は、JavaEE5仕様全体のアプリケーションクライアントルールを確認する必要があります。
最後に、Java EE 6には、JSR-299が含まれているため、説明した内容が何らかの形で発生する可能性があります。まだスペックがわからないのでコメントできません。
これがすべてお役に立てば幸いです。
アンマネージオブジェクトにEJBを注入できるかどうかも疑問です。詳細については、Weld(JSR 299リファレンス実装)のドキュメントを参照してください。
ただし、次のように、リポジトリまたはファクトリ内で手動で依存性注入を実行できます。
@Stateless
public PojoRespository {
@Inject
ResourceForPojos resource;
@PersistenceContext
private EntityManager em;
public Pojo findById(Object id) {
Pojo p = (Pojo) em.find(Pojo.class, id);
p.setResource(resource); // injects resource
return p;
}
}
インジェクションを実行する方法が多数ある場合は、インターセプターを使用できます。