Glassfish Bean参考查找失败

时间:2012-07-24 14:43:59

标签: java glassfish-3

这里有奇怪的问题。我有一个声明了远程接口的bean和一个定义为无状态bean的实现。由于我希望能够根据实现要求将bean替换为不同的bean,因此我在ejb-reference中声明了glassfish-web.xml

如果我使用name语法来引用像@EJB(name = "BeanReference")这样的引用名称,我可以成功注入bean。我也可以进行查找: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实例上。它仅适用于开发和测试。

使用Glassfish 3.1.1和NetBeans 7.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>

0 个答案:

没有答案