【发布时间】:2010-12-04 04:25:26
【问题描述】:
我有一个 EAR 文件,其中包含一堆 JAR,其中一个 JAR 包含本地会话 Bean (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 Unresolved 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
【问题讨论】:
-
“应用程序未部署:无法确定 EJB 3.0 ref Unresolved Ejb-Ref ITestBean@jndi 的本地业务与远程业务指定。” - 在这种情况下,你的价值观似乎很奇怪。 com.test.IEntityExtensionDefinitionBean 真的是该 bean 的本地接口吗?为什么你自己的bean和你试图引用的bean的名字一样?
-
啊,对不起。我试图用更简单的类和名称来淡化这个例子,但我错过了那个。我用正确的名称更新了问题。我想我终于找到了问题的根源。你提到我有一个我想引用的 bean,以及我的“自己的”bean,我不明白,因为我只有一个 bean。在阅读之后,我似乎必须注册我想要访问另一个 bean 的 bean。这真的是唯一的方法吗?如果我想从既不是托管也不是从托管类访问的 POJO 访问 bean 怎么办?