当前位置: 首页 > 知识库问答 >
问题:

JavaEE6:覆盖CDI替代方案

孙自怡
2023-03-14

我使用的是Glassfish 3.1.2.2,JavaEE6。

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

这应该是@替代CDI模式的完美应用,我为helper类API做了一个java接口;库中有一个默认实现,那么我就可以使用

在CDI1.0(java ee6)中,显然不可能从库外覆盖替代行为。

所以不管我在豆子里说了什么。在我的外部项目中,CDI不断选择库中定义的bean。

我考虑过通过生产者,但我没有找到如何让CDI将EntityManager作为参数提供给生产者,以便我可以将其转发给helper类。在这个项目中,我们通常使用@PersistenceContext注释注入EntityManager。

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


共有3个答案

红经亘
2023-03-14

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

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

否决库中定义的bean。

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

要在Arquillian集成测试中也实现这一点,必须将此调用添加到存档中:

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

javax。企业注射spi。扩展资源不需要在Arquillian中生效(参见SHRINKWRAP-266)。

丌官晔
2023-03-14

ApacheDeltaSpike提供了一个叫做全局替代的功能,它绕过了那些愚蠢的BDA规则。它已经用很多容器进行了测试,你不必手动关心细节。使用OpenWebBeans,你根本没有这个问题,一些版本的焊接通过WEB-INF中的beans.xml而不是META-INF支持它。

仲浩歌
2023-03-14

您可以编写一个可移植的扩展来实现这一点。收听ProcessAnnotatedType事件,并用自己的AnnotatedType替换。您可以使用ApacheDeltaspikeBeanBuilder类来帮助实现这一点。

 类似资料:
  • 代码覆盖是查找未被测试执行的代码区域的过程。不过要记住的是这并不能说明你测试代码的有效性。 在requirements.txt文件中添加依赖包: coverage==4.4.2 然后,我们在manage.py中新增一个命令: import coverage COV = coverage.coverage( branch=True, include='project/*',

  • 我正在使用supportlib v4来实现主细节流。 方法在单击后调用:

  • 这是一个重要的可量化指标,如果代码覆盖率很高,你就可以放心的修改代码,在发版本的时候也能睡个安稳觉。否则就是拆东墙补西墙,陷入无尽的 bug 诅咒中。 那么在 OpenResty 里面如何看到代码覆盖率呢?其实很简单,使用 LuaCov 可以很方便的实现。 我们先了解下 LuaCov,这是一个针对 Lua 脚本的代码覆盖率工具,通过 luarocks 来安装: luarocks install l

  • 作为CDI的新手,我想知道替代方案和限定符之间的实际区别。 在焊缝参考中,它指出: 4.3. 限定符注释 如果我们有多个实现特定bean类型的bean,注入点可以使用限定符注释精确指定应该注入哪个bean。 但在解释替代方案时,据说: 4.7.备选方案 替代方案是bean,其实现特定于特定的客户端模块或部署场景。 如果我理解正确的话,@Qualifier定义了目标bean的哪些实现被注入到注入点。

  • 我的代码运行在具有单独JVM的单独虚拟机上。我想在此虚拟机上以tcpserver模式设置JaCoCo代理以收集覆盖率数据。然后,我将在我的maven项目中以tcpclient模式设置JaCoCo代理,以连接到上面提到的VM并获取覆盖率数据。 问题是代理不收集任何覆盖数据。在中创建了覆盖率数据文件,但该文件为空。 下面是代理选项:-Java agent:/usr/xx/plugins/org . j

  • 本文向大家介绍Java中覆盖finalize()方法实例代码,包括了Java中覆盖finalize()方法实例代码的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是Java中关于覆盖finalize()方法的一次尝试,具体实现如下。 测试代码 执行结果: finalize methode executed yes,i am still alive Exception in thread "