首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java ee6:覆盖CDI替代方案

java ee6:覆盖CDI替代方案
EN

Stack Overflow用户
提问于 2013-09-02 14:09:09
回答 3查看 1.2K关注 0票数 3

我使用的是Glassfish 3.1.2.2,java ee6。

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

这应该是@Alternative CDI模式的完美应用。我为helper类API创建了一个java接口;库中有一个默认的实现,然后我可以在beans.xml中使用beans.xml标记;在我想要覆盖行为的项目中,我将指定自己在该特定项目的beans.xml中的助手的实现。

只是它不管用。显然 不可能可以覆盖CDI1.0 (java ee6)库外库中的替代行为。

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

我考虑了通过制片人,但没有找到如何让CDI将EntityManager作为参数提供给生产者,这样我就可以将它向前传递给helper类。在这个项目中,我们通常使用EntityManager注释注入@PersistenceContext

对于如何覆盖外部项目的CDI注入,有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-03 08:48:04

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

然而,我没有替换AnnotatedType (我不知道该如何做),而是使用了这里描述的技术:http://docs.jboss.org/weld/reference/latest/en-US/html/extend.html#d0e4800

并否决在库中定义的bean。

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

要在Arquillian集成测试中完成此工作,必须将此调用添加到您的存档中:

代码语言:javascript
运行
复制
addAsServiceProvider(Extension.class, <CDI extension class name>.class)

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

票数 0
EN

Stack Overflow用户

发布于 2013-09-03 02:34:22

您可以编写一个可移植的扩展来完成这个任务。侦听ProcessAnnotatedType事件,并将AnnotatedType替换为自己的事件。您可以使用Apache DeltaSpike BeanBuilder类来帮助解决这个问题。

票数 1
EN

Stack Overflow用户

发布于 2013-09-08 18:04:50

Apache DeltaSpike提供了一个名为全局替代的特性,它绕过了那些愚蠢的BDA规则。它是用很多容器进行测试的,您不需要手动地关心细节。对于OpenWebBeans,您根本没有这个问题,有些版本的Weld通过WEB中的beans.xml而不是META来支持它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18575174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档