关于springboot配置文件的便捷方法

1、实现配置文件与实体类的属性值做绑定:

        1.1、定义绑定配置类:

@Data
@ConfigurationProperties(prefix = "prop.bind")
public class BindConfig {
    private String name;

    private Integer age;

    private List list;

    private Map map;
}

        1.2、注意事项:

                1.2.1、prefix为需要获取配置文件中前缀为此值的下级所有配置类已配置对应值

                1.2.2、配置类的字段属性名必须保证与配置文件一致,支持驼峰(例:配置文件:blnp_name;配置类中:blnpName)

                1.2.3、配置文件中冒号后面填对应value时,需保留一个空格。否则配置不生效。(例:prop.bind.name: 小西瓜)

2、当配置文件绑定实现好后,需要使其生效。生效的方法大致有以下三种:

        2.1、通过@Component注解方式,直接在配置类上添加@Component@Configuration等注解,让Spring容器扫描并加载它

@Data
@Component
@ConfigurationProperties(prefix = "propi.bind")
public class BindConfig {
}

        2.2、借助 @Bean 的注解方式实现

@Configuration
public class AutoConfiguration {
    @Bean
    public BindConfig bindConfig() {
        return new BindConfig();
    }
}

        2.3、使用@EnableConfigurationProperties(也是最常用的方式)

@EnableConfigurationProperties({BindConfig.class})
@Configuration
public class AutoConfiguration {
}

3、既然可以通过实体类绑定,那么便有可能会产生以下几个问题:

        3.1、两者参数类型不匹配时,如何处理?

        比如说配置文件中有个“num”属性值为69k,配置类里定义的类型为int。很明显是无法转换成功的,并且启动会抛出以下异常

        当然,如果不需要校验的那么严格可以通过配置【ignoreInvalidFields = true】,来忽略这类错误。

@Data
@ConfigurationProperties(prefix = "prop.bind", ignoreInvalidFields = true)
public class BindConfig {
}

       3.2、如果配置文件中的属性比配置类中多,该如何处理?

        可通过配置【ignoreUnknownFields=false】属性类忽略那些未知字段

@Data
@ConfigurationProperties(prefix = "prop.bind", ignoreInvalidFields = true,ignoreUnknownFields=false)
public class BindConfig {
}

       3.3、如何将配置文件中的值转换为配置类里的POJO、List、Map类型?

针对该场景则对应扩展配置类,有如下:

        定义一个POJO类:

@Data
public class Pwd {
    private String user;

    private String pwd;

    private Integer code;
}

        扩展配置类:

@Data
@ConfigurationProperties(prefix = "prop.bind", ignoreInvalidFields = true, ignoreUnknownFields=false)
public class BindConfig {

    private String name;

    private Integer age = 18;

    private List list;

    private Map map;

    private Pwd mainPwd;
}

        配置文件对应格式为:

prop:
  bind:
    Name: wechat
    AGE: 1h
    list:
      - java
      - c
      - python
    map:
      wechat: wechat
      blogs: wechat
      git: wechat
    main_pwd:
      user: wechat
      pwd: wechat
      code: 9

        配置完成编译启动后,有如下结果:

BindConfig(name=wechat, age=20, list=[java, c, python], map={wechat=wechat, blogs=wechat, git=wechat}, mainPwd=Pwd(user=wechat, pwd=wechat, code=9), jwt=Jwt(token=11111111123, timestamp=1610880489123), tokens=[Jwt(token=123, timestamp=1111111), Jwt(token=abc, timestamp=2222222)], environment=StandardEnvironment {activeProfiles=[bind], defaultProfiles=[default], propertySources=[ConfigurationPropertySourcesPropertySource {name='configurationProperties'}, PropertiesPropertySource {name='systemProperties'}, OriginAwareSystemEnvironmentPropertySource {name='systemEnvironment'}, RandomValuePropertySource {name='random'}, OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/application-bind.yml]'}, OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/application.yml]'}]})

        3.4、如何解析配置文件里配置的json字符串 ?

        json字符串配置如下:

prop:
  bind:
    Jwt: '{"token": "11111111123", "timestamp": 1610880489123}'

         对应的实体类如下:

@Data
public class Jwt {
    private String token;

    private Long timestamp;
}

        此外,因为json字符串比较特殊;因此还需对该实体类的属性转换做调整:

@Component
@ConfigurationPropertiesBinding
public class JwtConverter implements Converter {
    @Override
    public Jwt convert(String source) {
        return JSONObject.parseObject(source, Jwt.class);
    }
}

        成功编译启动后有如下效果:

        3.5、如何对配置文件的值做校验呢?

         通过引入【hibernate-validator】实现校验,并在配置类里声明@Validated实现校验。jar包的依赖地址如下:


    org.hibernate.validator
    hibernate-validator

        实现示例如下,对配置类年龄字段有如下限制,而配置文件配置为12。则编译启动有如下结果:

关于springboot配置文件的便捷方法_第1张图片

关于springboot配置文件的便捷方法_第2张图片

扩展:

        hibernate-validator的一些常用注解

注解 作用
@AssertFalse 验证注解的元素值是 false
@AssertTrue 验证注解的元素值是 true
@DecimalMax(value=x) 验证注解的元素值小于等于指定的十进制value 值
@DecimalMin(value=x) 验证注解的元素值大于等于指定的十进制value 值
@Digits(integer=整数位数, fraction=小数位数) 验证注解的元素值的整数位数和小数位数上限
@Future 验证注解的元素值(日期类型)比当前时间晚
@Max(value=x) 验证注解的元素值小于等于指定的 value值
@Min(value=x) 验证注解的元素值大于等于指定的 value值
@NotNull 验证注解的元素值不是 null
@Null 验证注解的元素值是 null
@Past 验证注解的元素值(日期类型)比当前时间早
@Pattern(regex=正则表达式)  验证注解的元素值不指定的正则表达式匹配
@Size(min=最小值, max=最大值) 验证注解的元素值的在 min 和 max (包含)指定区间之内,如字符长度、集合大小
@Valid  该注解主要用于字段为一个包含其他对象的集合或map或数组的字段,或该字段直接为一个其他对象的引用,这样在检查当前对象的同时也会检查该字段所引用的对象。
@NotEmpty 验证注解的元素值不为 null 且不为空(字符串长度不为 0、集合大小不为 0
@Range(min=最小值, max=最大值) 验证注解的元素值在最小值和最大值之间
@NotBlank

验证注解的元素值不为空(不为 null、去

除首位空格后长度为 0),不同于@NotEmpty, @NotBlank 只应用于字符串且在比较时会去除字符串的空格

@Length(min=下限, max=上限) 验证注解的元素值长度在 min 和 max 区间内
@Email 验证注解的元素值是 Email,也可以通过正则表达式和 flag 指定自定义的 email 格式

你可能感兴趣的:(日常记录)