1

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

如果我使用名称语法来引用引用名称(如 @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 实例上。它是本地的,仅用于开发和测试。

使用 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>
4

0 回答 0