【问题标题】:WELD-001409: Ambiguous dependencies for type DataProvider with qualifiers @DefaultWELD-001409:带有限定符 @Default 的类型 DataProvider 的不明确依赖项
【发布时间】: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 {

}

【问题讨论】:

  • 你如何定义RDOLTP?你给他们加了@Qualifier吗?
  • @Eng.Fouad 是的,为此注释添加了限定符 (javax.inject.Qualifier)。

标签: java wildfly cdi weld


【解决方案1】:

通过将注释 OLTP 和 RD 从一个库(在 WILDFLY_HOME/modules 中)移动到另一个库(在部署 ear 文件中)解决了问题。

【讨论】:

    【解决方案2】:

    好吧,你自己解决了你的问题,但背景是,wildfly/jboss 中的模块和应用程序是由不同的类加载器加载的。

    因此,注解类不一样在有些复杂的 java 类加载世界中,例如类加载器 1 加载的 OLTP.class 和类加载器 2 加载的 OLTP.class 是不同的类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多