我正在使用 Glassfish 3.1.2.2,java ee6。
我有一个库,其中一个类使用 CDI 来获取辅助类。我想在我使用该库的一个特定项目中覆盖该 CDI 依赖项并强制该库使用我自己的助手类,该类特定于该项目。我可以随意修改这个库,但默认情况下它应该使用它的默认助手类,这样库的其他用户的行为就不会改变。
这应该是@Alternative
的完美应用CDI 模式。我为助手类 API 制作了一个 java 接口(interface);库中有一个默认实现,然后我可以使用 <alternatives>
beans.xml
中的标签;在我想要覆盖行为的项目中,我会在该特定项目的 beans.xml 中指定我自己的助手实现。
除非它不起作用。这是apparently impossible在 CDI 1.0 (java ee6) 中覆盖库之外的库的替代行为。
因此,无论我在外部项目的 beans.xml 中指定什么,CDI 都会继续选择库中定义的 bean。
我考虑过 going through a producer但我没有找到如何让 CDI 将 EntityManager 作为参数提供给生产者,以便我可以将它传递给帮助程序类。在这个项目中,我们通常使用 @PersistenceContext
注入(inject) EntityManager。注释。
关于如何从外部项目覆盖 CDI 注入(inject)的任何想法?
最佳答案
您可以编写一个可移植扩展来执行此操作。监听 ProcessAnnotatedType
事件并将 AnnotatedType
替换为您自己的。您可以使用 Apache DeltaSpike BeanBuilder
类来帮助解决这个问题。
关于jakarta-ee - java ee6 : override CDI alternative,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18575174/