2

@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 错误。]

4

1 回答 1

2

尝试使用注释的lookup属性。@EJB它是在 Java EE 6 中添加的,除非您在 Java 7 上或在 Java 6 JVM 的认可目录中添加了正确的 jar,否则您的 IDE 可能看不到它。在lookup属性中,您可以将 jndi 名称java:app/ejb/Fred或任何其他名称放在java:app.

然后在您的 application.xml 中创建一个名称java:app/ejb/Fred并将其链接到所需的 EJB。

<ejb-local-ref>
  <ejb-ref-name>java:app/ejb/Fred</ejb-ref-name>
  <local>com.foobar.Fred</local>
  <ejb-link>some-jar.jar#FredBean</ejb-link>
</ejb-local-ref>

如果这不起作用,您可能会不走运。

关于@ManagedBean 的注意事项

@ManagedBean定义不足和测试不足。它是在 Java EE 6 后期添加的,作为未来开发的占位符,并且没有进一步开发。我不建议使用它。

您可能会尝试将其切换到@javax.ejb.Singletonor@javax.ejb.Stateless服务而不是 . @ManagedBean,但理想情况下,即使不添加@ManagedBean.

如果您觉得有帮助,我可以在 TomEE 中确认上述所有工作。我确信 GlassFish 非常愿意接受补丁并在这方面提供帮助。

于 2013-08-01T16:50:35.120 回答