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。则编译启动有如下结果:
扩展:
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 |
|
@Length (min=下限, max=上限) |
验证注解的元素值长度在 min 和 max 区间内 |
验证注解的元素值是 Email,也可以通过正则表达式和 flag 指定自定义的 email 格式 |