项目启动时首先校验Spring Boot配置参数

1. 概述

在项目实际开发过程当中,为了更好的复用,咱们参考Spring Boot Starters,封装了许多企业内部中间件的starter。这些中间件的接入都须要申请并在项目中配置一些特定的参数。咱们经过@ConfigurationProperties注解,增长了在配置过程的体验,实现属性提示。一些参数是在中间件使用过程当中的必选参数,常常发现项目启动了,调用中间件时抛出异常,提示某个参数没有配置。git

这样的接入过程体验很很差。github

有没有一种方式在项目启动的时候就对配置的参数直接进行校验,而不是等到实际使用的时候再抛出错误提示呢?web

很幸运,Spring已经为咱们提供的Java Validation能够解决咱们的问题。spring

2. 增长启动校验

在咱们建立的Properties类中增长Validation相关配置:微信

/**
* ConfigProperties.
*
* @author Wang Jianchao(tinyking)
* <p>
* Created on 2020/8/20
*/

@Validated
@Data
@ConfigurationProperties(prefix = "config")
public class ConfigProperties {
@NotEmpty
private String name;
}

@Validated是Spring提供的校验注解,经过该注解告诉Spring这个类是须要进行校验处理的。app

@NotEmpty 是Java Validation API中提供的校验注解,表示name字段不能为空。不能为空是指不能是null,也不能是空字符串。框架

配置Bean编辑器

@Configuration
@EnableConfigurationProperties(ConfigProperties.class)
public class ValidationConfiguration
{

@Bean
public ConfigProperties configProperties() {
return new ConfigProperties();
}
}

上面的配置就会校验咱们在application.yml中有没有配置config.name参数。若是在配置文件中没有该配置,项目启动就会失败,并抛出校验异常:ide

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'config' to io.github.tinyking.springvalidation.config.ConfigProperties failed:

Property: config.name
Value: null
Reason: 不能为空

application.yml中,咱们增长config.name等配置项,可是不给它设置内容:spa

config:
name:

再次启动项目,发现错误信息发生了变化:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'config' to io.github.tinyking.springvalidation.config.ConfigProperties failed:

Property: config.name
Value:
Origin: class path resource [application.yml]:2:8
Reason: 不能为空


Action:

Update your application's configuration

3. 自定义校验

Spring还支持咱们进行自定义校验规则,经过自定义校验能够实现复杂的校验逻辑。

咱们建立一个校验类,并实现Validator接口:

/**
* ConfigPropertiesValidator.
*
* @author Wang Jianchao(tinyking)
* <p>
* Created on 2020/8/20
*/

public class ConfigPropertiesValidator implements Validator {
@Override
public boolean supports(Class<?> aClass) {
return ConfigProperties.class.isAssignableFrom(aClass);
}

@Override
public void validate(Object target, Errors errors) {
ConfigProperties config = (ConfigProperties) target;

if (!StringUtils.isEmpty(config.getName()) && config.getName().length() < 5) {
errors.rejectValue("name", "name.too.shot", "name is too shot");
}
}
}

须要注意的是,上面的Validator接口是Spring框架提供的,不是Java Validation API中的接口。

  • supports(Class<?> aClass)方法用来判断是否支持当前正在进行校验的实例
  • validate(Object target, Errors errors)方法中写实际的校验规则,并用 errors收集错误信息

接下来就是如何在Spring Boot启动时,对Properties进行校验了。这一步很是关键!

@Bean
public static ConfigPropertiesValidator configurationPropertiesValidator() {
return new ConfigPropertiesValidator();
}

其中有两个注意点:

  • 方法名必须为 configurationPropertiesValidator ,不然在启动的时候不会执行该校验
  • 方法必须声明为 static, 告诉Spring,该Bean的建立要在全部的Configuration以前

咱们修改在application.ymlconfig.name

config:
name: a

这样,name长度就不能知足咱们自定义的校验规则,启动程序,查看结果:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'config' to io.github.tinyking.springvalidation.config.ConfigProperties failed:

Property: config.name
Value: a
Origin: class path resource [application.yml]:2:9
Reason: name is too shot


Action:

Update your application's configuration

错误信息即为咱们自定义校验的结果。

4. 结论

经过配置Spring Boot启动校验功能,能够快速的识别参数配置的错误,使咱们在开发过程当中有更好starter集成体验。


本文分享自微信公众号 - Java码农(jarcoder)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索