@ManagedBean我的.ear文件lib目录中有一个。
@ManagedBean我有这个
:
@EJB(name = "ejb/Fred") // declares ejb reference and names it
private Fred fred;
在我.ear的文件中,META-INF/application.xml我有这个:
<ejb-local-ref>
<ejb-ref-name>ejb/Fred</ejb-ref-name> <!-- targets reference declared above -->
<local>com.foobar.Fred</local>
<ejb-link>some-jar.jar#FredBean</ejb-link>
</ejb-local-ref>
GlassFish 3.1.2.2 愉快地处理了这一点,并为我的几十个EJB做了正确的事情,这些 EJB中的@EJB字段名称为ejb/Fred: 它们都FredBean来自some-jar.jarEJB jar 作为它们的实现。没有混乱,没有大惊小怪,正如规范所预期的那样。
但是当涉及到@ManagedBean带有这些带@EJB注释字段的 s 时,绑定不会发生。
GlassFish 3.1.2.2 抛出了一个异常,指出存在许多Fred实现(在我的情况下就是存在——为什么我<ejb-local-ref>首先处于这种情况),所以它不能向我的fred领域注入一些东西。
也就是说,我无法定位从配置中命名的@ManagedBean-hosted@EJB引用。ejb/Fred
Managed Bean 1.0“规范”有点不祥地说:
托管 Bean 没有自己的组件范围的“<code>java:comp”命名空间。出于这个原因,Managed Beans 应该在“<code>java:module”或以上命名空间中定义资源[强调我的]。
更具体地说,显然这意味着我不能使用注释的name属性@EJB,因为正如其文档所述:
声明组件(例如,java:comp/env)环境中的 ejb 引用的逻辑名称。
[编辑: EJB 规范委员会刚刚更改了此处的语言以响应此问题;这实际上引发了更多问题——显然,您应该能够在name()元素中使用“绝对”资源名称。]
[编辑:我意识到您可以根据thisjava:module使用orjava:app前缀之一来控制 EJB 引用名称的范围。也许答案是定义我所有的s 两次:一次用于组件环境名称,一次用于名称?]<ejb-local-ref>META-INF/application.xmljava:app
[编辑:将引用声明为@EJB(name = "java:app/ejb/Fred")or @EJB(name = "java:module/ejb/Fred") and targeting it as that in myapplication.xml 's` 元素也不起作用。我相信这可能是一个直接的错误。]
[编辑: David Blevins 的lookup()解决方案尽其所能。 lookup()不是 的替代品name(),而是mappedName()and的替代品beanName(),理想情况下,我想在这些参考资料上指定它们,因为重新包装将是一场噩梦。此外,自动参考布线完全消失了;usinglookup()意味着您告诉容器 Deployer 或 Assembler 将在此处手动绑定引用,并且容器应该关闭。一个庞大的企业应用程序的噩梦。]
有没有办法使用application.xml-level<ejb-link>元素来定位@ManagedBean-hosted@EJB引用?
[编辑:我已经提交了一个带有测试用例的GlassFish 错误。]