【问题标题】:java ee6: override CDI alternativejava ee6:覆盖 CDI 替代方案
【发布时间】:2013-09-02 14:09:09
【问题描述】:

我使用的是 Glassfish 3.1.2.2,java ee6。

我有一个库,其中一个类使用 CDI 来获取一个辅助类。我想在一个使用该库的特定项目中覆盖该 CDI 依赖项并强制该库使用我自己的帮助程序类,而不是特定于该项目。我可以随意修改库,但默认情况下它应该使用其默认的帮助类,这样库的其他用户的行为不会改变。

这应该是@Alternative CDI 模式的完美应用。我为帮助类 API 制作了一个 java 接口;库中有一个默认实现,那么我可以使用beans.xml中的<alternatives>标签;在我想要覆盖行为的项目中,我会在该特定项目的 beans.xml 中指定我自己的帮助器实现。

除非它不起作用。 apparentlyimpossible 在 CDI 1.0 (java ee6) 中覆盖库外部库的替代行为。

因此,无论我在外部项目的 beans.xml 中指定什么,CDI 都会继续选择库中定义的 bean。

我考虑过going through a producer,但我没有找到如何让 CDI 将 EntityManager 作为参数提供给生产者,以便我可以将其传递给辅助类。在这个项目中,我们通常使用@PersistenceContext注解注入EntityManager。

关于如何从外部项目覆盖 CDI 注入的任何想法?

【问题讨论】:

    标签: jakarta-ee glassfish cdi


    【解决方案1】:

    您可以编写一个便携式扩展来执行此操作。收听ProcessAnnotatedType 事件并将AnnotatedType 替换为您自己的。您可以使用 Apache DeltaSpike BeanBuilder 类来帮助解决这个问题。

    【讨论】:

    • @Priority 注释呢?在这种情况下这不起作用还是仅适用于 JEE 7?
    • 嗯? CDI 1.0 或 1.1 中没有 @Priority 注释
    • 在 JEE 7 中有,我读过docs。然后你可以写@Alternative @Priority(Interceptor.Priority.APPLICATION+10) public class X 并且只使用注解覆盖默认的bean。
    • 啊,这可能来自 Interceptor 规范,它不是 CDI 规范的一部分。
    【解决方案2】:

    Apache DeltaSpike 提供了一个名为 global-alternatives 的功能,它绕过了那些愚蠢的 BDA 规则。它已经过大量容器的测试,您不必手动关心细节。使用 OpenWebBeans,您根本不会遇到这个问题,一些 Weld 版本通过 WEB-INF 中的 beans.xml 而不是 META-INF 来支持它。

    【讨论】:

      【解决方案3】:

      我最后使用的解决方案与LightGuard的建议有关:我有CDI扩展,并且按照建议覆盖了processAnnotatedType()。

      但是,我没有替换 AnnotatedType(我不确定我该怎么做),而是使用那里描述的技术: http://docs.jboss.org/weld/reference/latest/en-US/html/extend.html#d0e4800

      并否决库中定义的 bean。

      现在默认实现已被否决,如果我将自己的 bean 放入我的应用程序中,那就是 CDI 选择的那个。

      要使这项工作在 Arquillian 集成测试中也能正常工作,您必须将此调用添加到您的存档中:

      addAsServiceProvider(Extension.class, <CDI extension class name>.class)
      

      javax.enterprise.inject.spi.Extension 资源不需要在 Arquillian 中生效(请参阅 SHRINKWRAP-266)。

      【讨论】:

        猜你喜欢
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2012-09-12
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多