我有一个包含大量JAR的EAR文件,其中一个jar包含Local Session Beans(EJB3).我需要从非托管POJO中执行这些会话Bean的JNDI查找,这些POJO也包含在EAR中(在这种情况下也与EJB中的JAR相同).我试过跟随
Glassfish EJB FAQ,但无论我尝试什么,我都会继续收到javax.naming.NameNotFoundException.
我不确定一些事情.我应该在哪里放置我的ejb-jar.xml(我尝试过EARs meta-inf以及JARs meta-inf)?我需要sun-ejb-jar.xml吗?究竟什么是ejb-link,它做了什么?我可能做错了什么(我的配置几乎与常见问题解答中给出的本地查找相同)?
我列出了我尝试的一些配置和结果如下:
<enterprise-beans>
<session>
<ejb-name>ITestBean</ejb-name>
<ejb-class>com.test.TestBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>ITestBean</ejb-ref-name>
<local>com.test.ITestBean</local>
</ejb-local-ref>
</session>
</enterprise-beans>
应用程序部署但JNDI查找返回null.
<enterprise-beans>
<session>
<ejb-name>ITestBean</ejb-name>
<ejb-class>com.test.TestBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>ITestBean</ejb-ref-name>
<local>com.test.ITestBean</local>
<ejb-link>ITestBean</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
应用程序未部署:无法确定EJB 3.0 ref的未解决的Ejb-Ref ITestBean @ jndi的本地业务与远程业务指定.
<enterprise-beans>
<session>
<ejb-name>ITestBean</ejb-name>
<ejb-class>com.test.TestBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>ITestBean</ejb-ref-name>
<local>com.test.ITestBean</local>
<ejb-link>MyJar.jar#ITestBean</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
应用程序未部署:错误:未解决:MyJar.jar#ITestBean.
<enterprise-beans>
<session>
<ejb-name>ITestBean</ejb-name>
<local>com.test.ITestBean</local>
<ejb-local-ref>
<ejb-ref-name>ITestBean</ejb-ref-name>
</ejb-local-ref>
</session>
</enterprise-beans>
处理EjbDescriptor时出错
解决方法
您始终可以在System.out或日志中转储InitialContext中的所有名称.
//Get all the names in the initial context
NamingEnumeration children = initialContext.list("");
while(children.hasMore()) {
NameClasspair ncPair = (NameClasspair)children.next();
System.out.print(ncPair.getName() + " (type ");
System.out.println(ncPair.getClassName() + ")");
}
}