Wildfly 14 CDI:WELD-001408在从JBoss 7迁移后位于第三部分JAR上

Wildfly 14 CDI:WELD-001408在从JBoss 7迁移后位于第三部分JAR上,jboss,wildfly,cdi,weld,jboss-weld,Jboss,Wildfly,Cdi,Weld,Jboss Weld,我们正在将一些用Java5、6和7编写的旧系统迁移到Java8,并从JBoss7迁移到Wildfly 14。 迁移之后,我总是会遇到这样的错误: WELD-001408: Unsatisfied dependencies for type InterfaceTypeConverterProvider with qualifiers @Named 我知道从CDI 1.2开始,事情发生了变化,@Inject不再像以前那样工作,它需要一些重构。 我遇到了很多这样的错误,其中一些是我自己项目中的类,它

我们正在将一些用Java5、6和7编写的旧系统迁移到Java8,并从JBoss7迁移到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

这是带有discover all的my 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>

beans.xml始终只适用于它所在的归档文件(无论是jar还是war)。因此,您只为您自己的存档设置
bean发现模式
,而不是为第三方存档设置

最简单的选择:重新打包第三方jar并包含一个合适的
beans.xml

非侵入性选项:编写提供预期bean的生产者。通常,这是一种简单的方法:

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

我认为课堂上没有注射。否则它应该已经启用了cdi。

您应该使用的搜索词是“bean discovery”,例如@Kukeltje我以前尝试过,我在我的应用程序(不是第三部分jar)上添加了beans.xml,但仍然会出现错误,唯一的区别是现在我看到了相同的错误,但在我的项目中。我在这个项目中有超过1000个注入,我真的不想重构所有东西,有没有一种方法可以在不改变所有接口的情况下修复它?啊。。。这是my beans.xml:
查看堆栈中的“搜索、跟踪和提及”似乎您在将WAR中的bean注入第三方JAR时遇到了问题,是吗?AKA,bean是否在战争中使用限定符
@实现了
InterfaceTypeConverterProvider
?如果是这样的话,那么您正在观察JavaEE“伞式”规范可见性规则的实施。有很多种,但在您的案例中,问题是WAR可以从其依赖项(第三方WAR)中看到bean,但事实并非如此。JAR在战争中看不到任何bean,改变bean发现模式也无济于事。