前言
最近有个功能突然有个需求,需要在yml配置文件里配置多条路径,需要动态获取配置文件里的参数,根据接口接收的参数判断,使用对应的配置
就了解到yml数组,遂记录
一、 yml数组形式
upload-record-paths:
basepath: filerecord
list:
- name: 111
path: 111
- name: 222
path: 222
其中对象对应Java元素结构为map,一个 “ - ” 代表一组,整体是一个List,因为@Value不支持取复杂对象且限制较多,除了一个值一个值的取,只能使用SpEL(后文有解释),所以我使用配置类的方式
二、配置类取对象
@Configuration
@ConfigurationProperties(prefix = "upload-record-paths")
@Data
public class UploadRecordProperties {
public static List<Map<String, String>> list; //static 才能拿配置值
}
其中upload-record-paths为yml配置文件前缀,使用也很简单,代码中直接
// 动态获取配置文件 - 或者使用@Autowried注入配置对象,通过get获取
List<Map<String, String>> list = UploadRecordProperties.getList();
String path = null;
for (Map map : list){
String name = (String) map.get("name");
if (name.equalsIgnoreCase(fileType)){
path = recordbasepath + File.separator + (String) map.get("path") + File.separator + rocordId;
}
}
if (StringUtils.isBlank(path)){
// 没有对应类型
return ResponseEntityResult.error("没有找到匹配的文件类型:" + fileType);
}
大概是以上流程。
我个人有个参考使用方式可取出
@Value("#{'${com.xxx.xxx-list:}'.empty ? null : '${com.xxx.xxx-list:}'.split(',')}")
private List<String> list;
对应的yml格式为
# 通过,分隔使用的参数
com:
xxx:
xxx-list:
.dwt,.dwg,.dxf,.zip,.rar,.mxd
文章发布一个月后,发现了一个博主的好文章解释了为啥能这样,晒这
[@value 数组_SpringBoot @Value 读取配置,太强大了!](文章发布一个月后,发现了一个博主的好文章,晒这,能不使用配置类使用
@value 数组_SpringBoot @Value 读取配置,太强大了!
三、SpEL
前面说到@Value取值限制较多,这是因为除了正常的一个个参数使用$获取,就只剩下SpEL的方式了。
首先看看使用@Value和@ConfigurationProperties配置类的方式有什么不同
图片来自参考文章
我们可以看出使用@ConfigurationProperties配置类比@Value支持的方法多,其中松散绑定是
比如说有个yml参数是 file-upload
在配置类中可以写成file-upload或者fileUpload
其他几种可以查看参考材料里的文章了解。
四、参考材料
这是第三部分的参考文章:spring boot 配置文件properties,yml语法学习及属性获取@ConfigurationProperties和@Value