You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java SE中使用CDI 2.0 Producer方法遇依赖不满足问题求助

解决CDI 2.0中List类型注入的Unsatisfied dependencies问题

嘿,我之前在Java SE环境用CDI Producer的时候也踩过这个集合注入的坑,一眼就认出这个错误!咱们来一步步拆解和解决它。

首先,先搞懂为什么会报这个错:CDI对于List<T>这类集合类型的注入,默认行为是收集所有类型为T的bean实例,把它们打包成List返回,而不是直接去找一个返回List<T>的Producer方法。如果你的项目里没有任何T类型的bean(比如你要注入List<String>,但没有String类型的bean),就会抛出这个WELD-001408的依赖不满足异常。

接下来根据你的需求,给你两种最常用的解决方案:

方案1:注入你Producer返回的那个特定List(最常见需求)

如果你就是想把Producer生成的List直接注入,那必须给这个List加一个自定义限定符,告诉CDI:“我要的是这个Producer生成的List,不是收集其他bean的集合”。

步骤1:定义自定义限定符

import javax.inject.Qualifier;
import java.lang.annotation.*;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})
public @interface ProducedStringList {}

步骤2:给Producer方法加上这个限定符

public class MyListProducer {
    @Produces
    @ProducedStringList // 加上自定义限定符
    public List<String> produceMyStringList() {
        return Arrays.asList("apple", "banana", "cherry");
    }
}

步骤3:在注入点使用相同的限定符

public class MyService {
    @Inject
    @ProducedStringList // 匹配Producer的限定符
    private List<String> mySpecialList;

    // 测试方法
    public void printList() {
        System.out.println(mySpecialList);
    }
}

方案2:收集所有T类型的bean到List中

如果你确实想让CDI自动收集所有T类型的bean组成List,那你需要确保项目中存在对应的T类型的bean。比如你要注入List<String>,就得有String类型的bean(可以用Producer生成):

public class StringBeanProducer {
    @Produces
    public String produceFirstString() {
        return "hello";
    }

    @Produces
    public String produceSecondString() {
        return "world";
    }
}

这时候你的注入点不用改,CDI会自动把这两个String实例收集到List里:

public class MyService {
    @Inject
    private List<String> collectedStrings; // 会自动包含"hello"和"world"
}

额外检查:beans.xml配置是否正确

别忘了确认你的beans.xml配置没问题,否则CDI可能根本没扫描到你的Producer类:

  • 如果你的Producer类没有任何CDI scope注解(比如@ApplicationScoped),那要确保bean-discovery-mode设置为all,这样CDI会扫描所有类;
  • 如果用annotated模式,那Producer类需要加上@ApplicationScoped或者其他CDI注解,才能被扫描到。

示例beans.xml(放在src/main/resources/META-INF/下):

<?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_2_0.xsd"
       version="2.0"
       bean-discovery-mode="all">
</beans>

常见坑点总结

  • 忘记给Producer的集合加限定符,导致CDI走默认的“收集bean实例”逻辑;
  • beans.xml的发现模式配置错误,Producer类没被CDI扫描到;
  • 混淆了CDI注入集合的两种模式:是要单个集合bean,还是要多个同类型bean的集合。

内容的提问来源于stack exchange,提问作者Alex Theedom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:10:12