Spring中使用SPEL通过Split注入支持空值的List属性
解决Spring中@Value分号分隔配置转List/String[]的问题
问题原因
你当前的SpEL写法里,${my.list:}解析后得到a;b;c,但分号是SpEL的表达式分隔符,直接调用split(';')时会被Spring解析逻辑干扰,导致split未正确执行,最终只得到单个元素。
可行解决方案
方案1:修正SpEL的split写法
通过转义分号或用双引号包裹分隔符,让SpEL正确识别split参数:
@Value("#{T(java.util.Arrays).asList('${my.list:}'.split('\\;'))}") private List<String> myList;
或者用双引号包裹分号,写法更直观:
@Value("#{T(java.util.Arrays).asList('${my.list:}'.split(\";\"))}") private List<String> myList;
方案2:简化SpEL写法(推荐)
Spring支持直接通过SpEL将分割后的结果转为数组或List,无需手动调用Arrays.asList:
// 转为String数组 @Value("#{'${my.list:}'.split(';')}") private String[] myArray; // 直接转为List,Spring会自动完成转换 @Value("#{'${my.list:}'.split(';')}") private List<String> myList;
如果需要过滤空元素(比如配置为空时避免得到空字符串元素),可以添加流式过滤:
@Value("#{'${my.list:}'.split(';').stream().filter(s -> !s.isEmpty()).collect(java.util.stream.Collectors.toList())}") private List<String> myList;
方案3:使用@ConfigurationProperties(更优雅)
如果涉及多个相关配置项,推荐用@ConfigurationProperties配合@Delimiter指定分隔符:
@ConfigurationProperties(prefix = "my") public class MyProperties { @Delimiter(";") private List<String> list; // 生成getter、setter方法 }
然后在启动类或配置类上添加@EnableConfigurationProperties(MyProperties.class),之后直接注入MyProperties即可使用配置项。
效果验证
- 当配置为
my.list=a;b;c时,上述方案都会得到包含"a","b","c"的List/String[]; - 当配置为空或未配置时,方案1、2会得到含空字符串的集合(添加过滤后会得到空集合),方案3默认会得到空集合。
内容的提问来源于stack exchange,提问作者Fabrizio Stellato
相关产品推荐
相关产品推荐

