如何从properties文件配置值中提取List<List<String>>类型数据?
解决方案
共有3种可行的实现方式,可根据项目场景选择:
方案1:直接扩展SpEL表达式(最快实现)
在原有@Value的SpEL表达式基础上,使用SpEL集合投影语法对每个外层分割后的元素做二次拆分即可,示例代码如下:
// 注意如果需要去除元素前后空格、括号等特殊字符,可在split后追加trim、replace逻辑 @Value("#{'${case.value}'.split(';')}.![T(java.util.Arrays).stream(#this.split(',')).map(String::trim).toList()]") private List<List<String>> caseValue;
语法说明:![...]是SpEL的集合投影操作符,会遍历外层split得到的每一个字符串元素,对其执行[...]内的拆分逻辑。
方案2:使用@ConfigurationProperties+自定义Converter(最规范,适合配置较多的场景)
如果是Spring Boot项目,推荐用配置绑定的方式实现,可复用性更高:
- 首先注册自定义类型转换器:
@Component public class StringToListListConverter implements Converter<String, List<List<String>>> { @Override public List<List<String>> convert(String source) { return Arrays.stream(source.split(";")) .map(item -> Arrays.stream(item.split(",")) .map(String::trim) // 如需去除配置中的括号,打开下一行注释即可 // .map(s -> s.replaceAll("[()]", "")) .toList()) .toList(); } }
- 定义配置类:
@ConfigurationProperties(prefix = "case") public class CaseProperties { private List<List<String>> value; // 省略getter、setter }
- 在启动类上开启配置绑定:
@SpringBootApplication @EnableConfigurationProperties(CaseProperties.class) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
后续直接注入CaseProperties即可拿到解析后的嵌套列表。
方案3:手动解析(最灵活,适合有复杂自定义规则的场景)
如果拆分逻辑有特殊要求,可先注入原始配置字符串,在Bean初始化阶段手动解析:
@Value("${case.value}") private String caseValueStr; private List<List<String>> caseValue; @PostConstruct public void parseCaseValue() { caseValue = Arrays.stream(caseValueStr.split(";")) .map(item -> Arrays.stream(item.split(",")) .map(String::trim) // 可自定义任意处理逻辑,比如括号过滤、空值过滤等 .filter(s -> !s.isBlank()) .toList()) .toList(); }
内容的提问来源于stack exchange,提问作者murari99732
相关产品推荐
相关产品推荐

