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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:15:36