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

1. 概述

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

这样的接入过程体验很不好。

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

很幸运,Spring已经为我们提供的Java Validation可以解决我们的问题。

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这个类是需要进行校验处理的。

@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参数。如果在配置文件中没有该配置,项目启动就会失败,并抛出校验异常:

***************************
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等配置项,但是不给它设置内容:

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源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

微信关注我们

原文链接:https://my.oschina.net/u/140022/blog/4521334

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。