ここで奇妙な問題。リモートインターフェースが宣言されたBeanと、ステートレスBeanとして定義された実装があります。実装要件に応じてBeanを別のBeanに置き換えられるようにしたいので、でejb-reference
宣言しましたglassfish-web.xml
。
name構文を使用して。のような参照名を参照すると、Beanを正常に注入できます @EJB(name = "BeanReference")
。ルックアップも実行できますnew InitialContext().lookup("java:comp/env/BeanReference")
。
私が注射をまったくしていないとき(いいえ@EJB
)、奇妙なことが起こります。次に、ルックアップは「javax.naming.NameNotFoundException: No object bound to name java:comp/env/BeanReference
」で失敗します。「」にペアをリストすると、アプリケーションのどこかでインジェクションが発生java:comp/env
しない限り、参照が存在しないことが確認されます。@EJB
jndi-nameエントリをチェックし、初期化中にGlassfishからの出力と一致することを確認しました。
@Local
代わりにを使用してみたところ@Remote
、同じ結果が得られました。@Remote
実際のデプロイメントでは、MyBean
実装はリモートのGlassfishインスタンスに存在する可能性が高いため、私は好みます。これは、開発とテストのためだけにローカルです。
Glassfish3.1.1およびNetBeans7.1.2の使用。以下のコードスニペット...わかりやすくするために例外処理は省略されています。
@Remote
public interface MyBean {
public String doSomething();
}
@Stateless
public class MyBeanImpl implements MyBean {
@Override
public String doSomething() {
return "something";
}
}
@Stateless
@LocalBean
public class MyOtherBean {
public MyOtherBean() {
Context ctx = new InitialContext();
MyBean myBean = (MyBean)ctx.lookup("java:comp/env/BeanReference");
String rc = myBean.doSomething();
System.out.println("rc = " + rc);
}
}
<ejb-ref>
<ejb-ref-name>BeanReference</ejb-ref-name>
<jndi-name>java:global/appName/MyBeanImpl!com.test.bean.MyBean</jndi-name>
</ejb-ref>