这里有奇怪的问题。我有一个声明了远程接口的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>