前言
项目中有可能涉及到从 yml 或 properties 配置文件加载复杂对象如数组、集合、嵌套对象等。针对这种需求以下举一个例子来实现对嵌套对象(包含集合)的加载。
1.加载目标
{
"clientInfos":[
{
"clientId":"123",
"clientSecret":"veradsfiwee21dw",
"apiLimitSwitch":true,
"ipLimitSwitch":true,
"ipWhiteList":[
"192.168.1.100",
"192.168.1.101"
],
"apiWhiteList":[
"/api/user/list",
"/api/user/detail"
]
},
{
"clientId":"456",
"clientSecret":"cneuave23hjf3io",
"apiLimitSwitch":true,
"ipLimitSwitch":false,
"apiWhiteList":[
"/api/user/list",
"/api/user/detail"
]
}
]
}
2.引入依赖
// gradle
compileOnly "org.springframework.boot:spring-boot-configuration-processor"
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
// maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3.实体类
实体类内容以及注解配置
(1)ClientProperties.java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import java.util.List;
@Configuration
//yml配置文件中的前缀
@ConfigurationProperties(prefix = "client-config")
// classpath 后跟你需要加载的配置文件名称
@PropertySource("classpath:application-client.yml")
public class ClientProperties {
/**
* 客户端配置信息列表
*/
private List<ClientInfo> clientInfos;
public List<ClientInfo> getClientInfos() {
return clientInfos;
}
public void setClientInfos(List<ClientInfo> clientInfos) {
this.clientInfos = clientInfos;
}
}
(2)ClientInfo.java
public class ClientInfo {
/**
* 客户端id
*/
private String clientId;
/**
* 客户端秘钥
*/
private String clientSecret;
/**
* 接口过滤开关:ture-开启,false-关闭
*/
private boolean apiLimitSwitch;
/**
* ip过滤开关:ture-开启,false-关闭
*/
private boolean ipLimitSwitch;
/**
* 接口白名单配置列表
*/
private List<String> apiWhiteList;
/**
* ip白名单配置列表
*/
private List<String> ipWhiteList;
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getClientSecret() {
return clientSecret;
}
public void setClientSecret(String clientSecret) {
this.clientSecret = clientSecret;
}
public boolean isApiLimitSwitch() {
return apiLimitSwitch;
}
public void setApiLimitSwitch(boolean apiLimitSwitch) {
this.apiLimitSwitch = apiLimitSwitch;
}
public boolean isIpLimitSwitch() {
return ipLimitSwitch;
}
public void setIpLimitSwitch(boolean ipLimitSwitch) {
this.ipLimitSwitch = ipLimitSwitch;
}
public List<String> getApiWhiteList() {
return apiWhiteList;
}
public void setApiWhiteList(List<String> apiWhiteList) {
this.apiWhiteList = apiWhiteList;
}
public List<String> getIpWhiteList() {
return ipWhiteList;
}
public void setIpWhiteList(List<String> ipWhiteList) {
this.ipWhiteList = ipWhiteList;
}
}
4.配置文件
配置文件中属性名称与实体对象中属性名称是有所区别的,实体对象中的属性是以驼峰的格式,而在配置文件中需要注意的是单词与单词之间(即驼峰处)不再以大写字母区分,而是以符号 “-” 分割。对于列表(数组)的数据配置需要在开头第一个属性名称前增加一个前缀 “-”。特别注意配置项要严格遵循缩进格式。
application-client.yml
client-config: #这里对应 @ConfigurationProperties(prefix = "client-config") 前缀
client-infos: #这里对应 ClientProperties.java 中的属性 List<ClientInfo> clientInfos 的名称并以 “-” 区分开单词
#第一个值
- client-id: 123 #应用Id
client-secret: veradsfiwee21dw #应用秘钥
ip-limit-switch: true
api-limit-switch: true
ip-white-list: #配置ip白名单
- 192.168.1.100
- 192.168.1.101
api-white-list: #配置api白名单
- /api/user/list
- /api/user/detail
#第二个值
- client-id: 456
client-secret: cneuave23hjf3io
ip-limit-switch: true
api-limit-switch: false
api-white-list:
- /api/user/list
- /api/user/detail
版权声明:本文为qq_38531706原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。