【问题标题】:Weld on Java SE does not use alternativeJava SE 上的 Weld 不使用替代方法
【发布时间】:2023-03-30 04:45:01
【问题描述】:

我有 projectAprojectBprojectC Eclipse Maven 项目。

  • ProjectA 包含:
    • IMyApi 接口。
    • “空”META-INF\beans.xml 文件。
  • ProjectB 包含:
    • IMyConfig接口。
    • MyConfigJndi 实现 IMyConfig
    • MyApiImpl 实现 IMyApi,具有属性 @Inject private IMyConfig config;
    • “空”META-INF\beans.xml 文件。
  • ProjectC 包含:
    • IMyConfigMyConfigAlter 实现,标记为 @Alternative
    • 一个 Main 类(和方法),用于初始化 Weld SE 并检索一个 IMyApi bean。
    • META-INF\beans.xml,其中MyConfigAlter 列在alternatives 部分中。

现在,我运行 Main 类,并且成功检索了 IMyApi bean(作为 MyApiImpl 实例)。但是这样的实例已经在其config 属性中注入了MyConfigJndi 实例,而不是替代版本(MyConfigAlter

我正在使用 Eclipse Luna + M2Eclipse。

我做错了什么?

更新:我发现使用@Specializes 而不是@Alternative 可以解决问题,但我仍然认为这不是正确的解决方案(在某些情况下,我可能无法访问“默认”实现)。

更新 2:

我正在使用 Weld-se,2.2.10.Final:

<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>2.2.10.Final</version>
    <scope>runtime</scope>
</dependency>

而且初始化很简单

WeldContainer weld =
  new Weld().
    initialize();
IMyApi myApi =
  weld.
    instance().
    select(
      IMyApi.
        class).
    get();

【问题讨论】:

  • 您能否提供一些信息,例如您使用的是什么版本的焊接,您是如何引导的?专业化对我来说听起来很奇怪。
  • @JohnAment 感谢您的关注,我添加了请求的数据。
  • 你上面提到的三个jar中,初始化代码在哪一个?
  • @JohnAment 在ProjectC 中,在Main 类的main 方法中。

标签: java cdi weld weld-se


【解决方案1】:

使用beans.xml 描述符中的alternatives 元素选择替代方案只会影响相应的bean 存档,即在您的情况下为ProjectC,如Declaring selected alternatives for a bean archive 中所述。基于此,ProjectB bean 存档注入 MyConfigJndi 实现是合乎逻辑的。

自 CDI 1.2 起,可以使用 @Priority 注释为应用程序全局选择替代方案,如 Declaring selected alternatives for an application 中所述。

所以在你的情况下,你可以写:

@Priority(Interceptor.Priority.Application)
@Alternative
class MyConfigAlter {
}

【讨论】:

    【解决方案2】:

    解决此问题的另一种方法是使用-Dorg.jboss.weld.se.archive.isolation=false - 来自http://docs.jboss.org/weld/reference/2.2.11.Final/en-US/html/environments.html#_bean_archive_isolation_2

    发生这种情况的原因是类路径上的每个 JAR 都变成了自己的 bean 存档。由于从 1.2 开始的 CDI 规范不包括 SE 规范,因此没有定义类路径如何在此模式下运行。这不一定是 SE 应用的设计方式,因为每个 JAR 都没有唯一的类加载器。

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 2014-11-06
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多