我有一个包含大量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() + ")"); } }