gpt4 book ai didi

java - Weld on Java SE 不使用替代方案

转载 作者:行者123 更新时间:2023-11-29 03:02:24 26 4
gpt4 key购买 nike

我有 projectAprojectBprojectC Eclipse Maven 项目。

  • ProjectA 包含:
    • IMyApi 接口(interface)。
    • “空”META-INF\beans.xml 文件。
  • ProjectB 包含:
    • IMyConfig 接口(interface)。
    • 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 属性中注入(inject)了 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();

最佳答案

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

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

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

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

关于java - Weld on Java SE 不使用替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34019820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com