jakarta-ee - java ee6 : override CDI alternative

标签 jakarta-ee glassfish cdi

我正在使用 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/

相关文章:

java - 使用 Producer 方法时,CDI (Weld SE) 不会注入(inject)内部依赖项

java - 从 EJB 读取文件

eclipse - 将 J2EE 安装到现有的 Eclipse IDE 中

java - 从 Eclipse 部署到 Glassfish,不包含类

java - 为什么 Glassfish 有两个 'glassfish' 文件夹和重复目录?

java - 通过@Resource注入(inject)TimerService时为"Injection data not found in JNDI context"

java - 从无状态 Bean 返回有状态 Java Bean?

java - 如何在 scriptlet 标签中获取 jsp 页面的某些组件的值?

java - 运行 Glassfish 3.1.2.2 时出错 : Address localhost:4848 is already in use

java - CDI Weld 忽略排除项