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