Java glassfishbean引用查找失败
这里是维尔德问题。我有一个声明了远程接口的bean和一个定义为无状态bean的实现。由于我希望能够根据实现需求用不同的bean替换bean,因此我在Java glassfishbean引用查找失败,java,glassfish-3,Java,Glassfish 3,这里是维尔德问题。我有一个声明了远程接口的bean和一个定义为无状态bean的实现。由于我希望能够根据实现需求用不同的bean替换bean,因此我在glassfishweb.xml中声明了一个ejb引用 如果我使用名称语法引用引用名称,比如@EJB(name=“BeanReference”),我就可以成功地注入bean。我还可以进行查找:newinitialcontext().lookup(“java:comp/env/BeanReference”) 奇怪的事情发生在我根本没有注射的时候(没有@
glassfishweb.xml
中声明了一个ejb引用
如果我使用名称语法引用引用名称,比如@EJB(name=“BeanReference”)
,我就可以成功地注入bean。我还可以进行查找:newinitialcontext().lookup(“java:comp/env/BeanReference”)
奇怪的事情发生在我根本没有注射的时候(没有@EJB
)。然后查找失败,出现“javax.naming.NameNotFoundException:没有绑定到名称java:comp/env/BeanReference的对象”
”。如果我在“java:comp/env
”中列出了这些对,它将确认引用不存在,除非在应用程序中的某个地方发生了@EJB
注入。我已经检查了jndi名称条目,并确认它在初始化期间与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>
@Remote
公共接口MyBean{
公共字符串doSomething();
}
@无国籍
公共类MyBeanImpl实现了MyBean{
@凌驾
公共字符串doSomething(){
返回“某物”;
}
}
@无国籍
@本地豆
公共级肌球蛋白{
公共菜豆(){
Context ctx=新的InitialContext();
MyBean MyBean=(MyBean)ctx.lookup(“java:comp/env/BeanReference”);
字符串rc=myBean.doSomething();
System.out.println(“rc=”+rc);
}
}
BeanReference
java:global/appName/MyBeanImpl!com.test.bean.MyBean
目前,我添加了一个注入引用的虚拟bean,它可以正常工作。bean是无状态的,从未被引用过。