Spring注入List属性失败:ConversionNotSupportedException异常求助
问题分析与解决方案
核心原因
1. 循环依赖触发代理生成
你的Bean定义存在闭环循环依赖:
defaultProblematicBean依赖problematicStrategiesList完成初始化problematicStrategiesList中的bean1/bean2以defaultProblematicBean作为父Bean,间接依赖defaultProblematicBean
Spring处理循环依赖时,为了提前暴露未完全初始化的Bean,会对problematicStrategiesList生成JDK动态代理(因为List是接口)。但这个代理对象的初始化依赖defaultProblematicBean的完成,而defaultProblematicBean又在等待注入该代理List,最终导致代理实例未完成初始化就被尝试注入,触发Singleton instance not initialized yet异常。
2. Spring 5.3.29的行为变更
Spring 5.3.29版本对循环依赖的处理逻辑做了优化调整,此前版本中集合类型的循环依赖可能不会触发代理生成,或代理初始化时机不同。新版本中,Spring对集合类的循环依赖开始生成JDK代理,但在这种嵌套循环依赖的场景下,代理的初始化流程出现冲突,进而引发类型转换异常。
解决方案
方案1:打破循环依赖(推荐)
修改Bean定义,避免List中子Bean依赖「依赖该List的父Bean」,通过抽象父Bean剥离公共配置:
<!-- 为内部类单独定义抽象父Bean,仅保留公共属性,不注入strategies --> <bean id="baseProblematicBean" abstract="true" class="com.application.ProblematicClass"> <!-- 此处定义内部类需要的公共配置 --> </bean> <alias name="defaultProblematicBean" alias="problematicBean" /> <bean id="defaultProblematicBean" class="com.application.ProblematicClass"> <property name="strategies" ref="problematicStrategiesList" /> </bean> <alias name="defaultProblematicStrategiesList" alias="problematicStrategiesList" /> <util:list id="defaultProblematicStrategiesList"> <bean id="bean1" parent="baseProblematicBean" class="com.application.ProblematicClass$ProblematicInnerClass1" /> <bean id="bean2" parent="baseProblematicBean" class="com.application.ProblematicClass$ProblematicInnerClass2" /> </util:list>
方案2:显式指定List实现类
在util:list标签中指定具体的List实现类,让Spring生成真实集合实例而非代理:
<util:list id="defaultProblematicStrategiesList" list-class="java.util.ArrayList"> <bean id="bean1" parent="defaultProblematicBean" class="com.application.ProblematicClass$ProblematicInnerClass1" /> <bean id="bean2" parent="defaultProblematicBean" class="com.application.ProblematicClass$ProblematicInnerClass2" /> </util:list>
方案3:延迟初始化打破循环
给相关Bean添加延迟初始化配置,避免Spring提前触发代理生成:
<bean id="defaultProblematicBean" class="com.application.ProblematicClass" lazy-init="true"> <property name="strategies" ref="problematicStrategiesList" /> </bean> <util:list id="defaultProblematicStrategiesList" lazy-init="true"> <bean id="bean1" parent="defaultProblematicBean" class="com.application.ProblematicClass$ProblematicInnerClass1" /> <bean id="bean2" parent="defaultProblematicBean" class="com.application.ProblematicClass$ProblematicInnerClass2" /> </util:list>
方案4:调整Spring版本
可尝试升级到Spring 5.3.x的后续维护版本(如5.3.30+),该问题可能已被官方修复;若为紧急场景,也可临时降级到5.3.28版本,但不推荐长期使用旧版本。
内容的提问来源于stack exchange,提问作者user1532449
相关产品推荐
相关产品推荐

