gpt4 book ai didi

jakarta-ee - CDI 与 @Produces 的不明确依赖 - 为什么?

转载 作者:行者123 更新时间:2023-12-02 08:49:29 24 4
gpt4 key购买 nike

我正在使用如下代码:

public Configuration {

private boolean isBatmanCar = someMethod(...);

@Produces
public Car getCar(@New Car car) {
if(isBatmanCar) {
car.setName("BatmanCar");
}
return car;
}
}

public Car {
private String name = "NormalCar";

public void setName(String name) {
this.name = name;
}
}

public Demo {
@Inject
Car car;

// rest of code
}

当我将应用程序部署到 glassfish(Java EE 6 顺便说一句)时,我得到

AmbigeousResolutionException:WELD-001318 无法解析具有限定符 [@Any @Default] 的 (...) Car 之间的不明确依赖关系 (...) 具有限定符 [@Any @Default] 的生产者方法 [Car]

我知道当我将 @Alternative 添加到 Car 类时它会起作用,但我想知道这是否是正确的方法,以及为什么我必须这样做?

你能告诉我在这种情况下@Produces的正确用法是什么吗?

我正在使用 Java EE 6、CDI 1.0、EJB 3.1、Glassfish 3.2

最佳答案

该错误是由于您有 2 个 Car 类型的 bean,一个是类,另一个是生产者。您有两个明显的解决方案来解决歧义:

首先,将逻辑放在原始类中的 isBatmanCar 字段后面(例如在构造函数或 @PostConstruct 方法中)并删除生产者。这样就只剩下一个 Car bean。

或者,如果您确实想要 2 个 bean 或者无法避免它,您应该为生成的 bean 创建一个限定符:

 @Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
@Qualifier
public @interface BatmanChecked {
}

并在生产者上使用它,

@Produces
@BatmanChecked
public Car getCar(Car car) {...}

能够注入(inject)汽车类型

@Inject
Car stdCar;

@Inject
@BatmanChecked
Car batCheckedCar;

限定符是解决不明确注入(inject)的自然选择。使用 @Alternative 也可以,但这更多的是一种技巧,而不是一个好的实践。

最后评论:这里不需要 @New,因为您的 Car bean 没有作用域(@Dependent 作用域也是如此)。 @New 仅当生产者注入(inject)作用域不是 @Dependent 的 bean 时才有用。也就是说,如果您的 Car 类位于 @Dependent 范围内,则此代码不是很有用。

关于jakarta-ee - CDI 与 @Produces 的不明确依赖 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22982422/

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