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