WELD-001409: Неоднозначные зависимости для типа DataProvider с квалификаторами @Default - PullRequest
0 голосов
/ 06 марта 2020

Все компоненты (jars, wars) имеют bean-компоненты. xml с bean-discovery-mode = "annotated".

DataProvider - интерфейс, все классы, реализующие этот интерфейс, не аннотируются. Существует только один производитель с двумя методами:

@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()]

"Неоднозначные зависимости для Тип DataProvider с квалификаторами @Default "- внедрение только с аннотациями @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 {

}

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Ну, вы сами решили свою проблему, но фон в том, что модули и приложения в wildfly / jboss загружаются разными загрузчиками классов.

Следовательно, классы аннотаций не совпадают в несколько запутанном мире java загрузки классов, например, OLTP.class, загружаемый загрузчиком классов 1, и OLTP.class, загружаемый загрузчиком классов 2, - это разные классы.

1 голос
/ 06 марта 2020

Проблема решена путем перемещения аннотаций OLTP и RD из одной библиотеки (в WILDFLY_HOME / modules) в другую (в файле ear развертывания).

...