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
相关产品推荐
相关产品推荐

