【发布时间】:2020-03-06 09:51:57
【问题描述】:
所有组件(jars、wars)都有 beans.xml 和 bean-discovery-mode="annotated"。
DataProvider - 接口,所有实现该接口的类都没有注解。 仅存在一个具有 2 种方法的生产者:
@ApplicationScoped
public class DataProviderProducer {
@Resource(lookup = JndiNames.DS_OLTP)
private DataSource oltpDataSource;
@Resource(lookup = JndiNames.DS_RD)
private DataSource rdDataSource;
@Produces
@OLTP
public DataProvider createOltpDataProvider() {
return new JDBCDataProvider(oltpDataSource);
}
@Produces
@RD
public DataProvider createRdDataProvider() {
return new JDBCDataProvider(rdDataSource);
}
}
这样注入时:
@Inject
@OLTP
private DataProvider dp;
我们得到以下错误:
org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type DataProvider with qualifiers @Default
at injection point [BackedAnnotatedField] @OLTP @Inject private mypackage.MyBean.dp
at mypackage.MyBean.dp(MyBean.java:0)
Possible dependencies:
- Producer Method [DataProvider] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces @RD public mypackage.injection.DataProviderProducer.createRdDataProvider()],
- Producer Method [DataProvider] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces @OLTP public mypackage.injection.DataProviderProducer.createOltpDataProvider()]
“带有限定符 @Default 的类型 DataProvider 的不明确依赖项”- 仅使用 @RD 或 @OLTP 注释进行注入,我没有在任何地方使用 @Default。 10次重新检查代码中的所有内容,我不知道该怎么办。
使用 WildFly 18、OpenJDK 13。
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
public @interface OLTP {
}
//
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
public @interface RD {
}
【问题讨论】:
-
你如何定义
RD和OLTP?你给他们加了@Qualifier吗? -
@Eng.Fouad 是的,为此注释添加了限定符 (javax.inject.Qualifier)。