Wildfly 14 CDI: WELD-001408 на 3-й части JAR после миграции с JBoss 7 - PullRequest
0 голосов
/ 02 мая 2019

Мы переносим несколько старых систем, написанных на Java 5, 6 и 7, на Java 8 и с JBoss 7 на Wildfly 14. После миграции я постоянно получаю такую ​​ошибку:

WELD-001408: Unsatisfied dependencies for type InterfaceTypeConverterProvider with qualifiers @Named

Я понимаю, что с CDI 1.2 все изменилось, и @Inject не работает, как раньше, и требует некоторого рефакторинга.Я получил много таких ошибок, некоторые из них являются классами в моем собственном проекте, которые пытаются внедрить другие классы также внутри моего проекта, те, которые я могу исправить.

Проблема в том, что мой проект загружает некоторые классы, которые пытаютсявнедрить другие классы извне, это зависимости jar, которые я не могу контролировать и не могу изменить код этих jar.

Например:

11:15:54,552 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.deployment.unit."myApp-war-9.2-JAVA8-SNAPSHOT.war".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."myApp-war-9.2-JAVA8-SNAPSHOT.war".WeldStartService: Failed to start service at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1728)
  at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1556)
  at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
  at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
  at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
  at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
  at java.lang.Thread.run(Thread.java:748)
Caused by: org.jboss.weld.exceptions.DeploymentException: Exception List with 46 exceptions:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type InterfaceTypeConverterProvider with qualifiers @Named
  at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedMethod] @Inject public thirdPartJar.converter.context.AbstractConverter.setTypeConverterProvider(@Named InterfaceTypeConverterProvider)
  at thirdPartJar.converter.context.AbstractConverter.setTypeConverterProvider(AbstractConverter.java:0)
WELD-001475: The following beans match by type, but none have matching qualifiers:
  - Managed Bean [class thirdPartJar.converter.context.TypeConverterProvider] with qualifiers [@Any @Default]

Ошибкапоказывает проблему в классе thirdPartJar.converter.context.AbstractConverter , и я не могу коснуться кода на этом ... так, что я должен сделать?Можно ли понизить версию Wildfly Weld или заставить его использовать более старую версию CDI?

Это мой файл beans.xml со всем обнаружением, но он все еще не может найти реализации.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.2" bean-discovery-mode="all">
</beans>

1 Ответ

1 голос
/ 03 мая 2019

beans.xml всегда относится только к архиву, в котором он находится (будь то кувшин или война).Таким образом, вы устанавливаете bean-discovery-mode только для своего собственного архива, а не для стороннего.

Самый простой вариант: переупаковать банку стороннего производителя и включить подходящий beans.xml.

Ненавязчивая опция: напишите производителя, который поставляет ожидаемые бобы.Обычно это может быть простой метод:

@Produces
@Named
public InterfaceTypeConverterProvider createInterfaceTypeConverterProvider() {
    return new InterfaceTypeConverterProvider();
}

Я так понимаю, что в классе нет инъекций.В противном случае он уже должен был быть включен cdi.

...