SpringBoot 加载复杂对象配置文件

  • Post author:
  • Post category:其他




前言


项目中有可能涉及到从 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 版权协议,转载请附上原文出处链接和本声明。