1

ここで奇妙な問題。リモートインターフェースが宣言された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しない限り、参照が存在しないことが確認されます。@EJBjndi-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>
4

0 に答える 0