@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.jar
EJB 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.xml
java:app
[编辑:将引用声明为@EJB(name = "java:app/ejb/Fred")
or @EJB(name = "java:module/ejb/Fred") and targeting it as that in my
application.xml 's
` 元素也不起作用。我相信这可能是一个直接的错误。]
[编辑: David Blevins 的lookup()
解决方案尽其所能。 lookup()
不是 的替代品name()
,而是mappedName()
and的替代品beanName()
,理想情况下,我想在这些参考资料上指定它们,因为重新包装将是一场噩梦。此外,自动参考布线完全消失了;usinglookup()
意味着您告诉容器 Deployer 或 Assembler 将在此处手动绑定引用,并且容器应该关闭。一个庞大的企业应用程序的噩梦。]
有没有办法使用application.xml
-level<ejb-link>
元素来定位@ManagedBean
-hosted@EJB
引用?
[编辑:我已经提交了一个带有测试用例的GlassFish 错误。]