1. 概述

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

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

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

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

2. 增加启动校验

在我们创建的Properties类中增加Validation相关配置:

/** * ConfigProperties. * * @author Wang Jianchao(tinyking) * 

 * 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) * 

 * 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() 

需要注意的是,上面的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.yml中config.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 shotAction:Update your application's configuration

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

4. 结论

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

bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数相关推荐

  1. 项目启动时socket自动启动_spring boot 项目在启动时调用接口

    1.环境 目前开发的项目使用的spring boot(2.1.4.RELEASE)+ssm 2. 需求 现在有一个数据处理任务的接口,在spring boot项目启动后,可以手动的去启动任务,但是这样 ...

  2. java 项目启动初始化_Spring项目启动时执行初始化方法

    一.applicationContext.xml配置bean init-method="initKeyWord"> classpath:sensitive-word.xml ...

  3. spring在项目启动时就执行特定方法

    如何在项目启动时就执行特定方法 1. 方法上加注解@PostConstruct @Compant public class InitDemo{@PostConstructpublic void ini ...

  4. java启动时执行_java怎么实现项目启动时执行指定方法

    本文实例为大家共享了java项目启动时执行指定方法,供大家参考,详细内容如下 想到的就是监听步骤如下: 1.配置web.xml com.listener.InitListener 2.编写InitLi ...

  5. mysql远程一会不用卡住_连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的,...

    连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的, 2018-03-12 17:08:52.532DEBUG[localhost-startStop-1]o.s.beans.factor ...

  6. java中项目启动时加载_如何在项目启动时,加载或解析某配置文件

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...

  7. 在web项目启动时,使用监听器来执行某个方法

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 这里写了个简 ...

  8. 如何在项目启动时就执行某些操作

    参考资料:如何在项目启动时就执行某些操作 在实际的项目开发中经常会遇到一些需要在项目启动的时候进行初始化操作的需求,比如初始化线程池,配置某些对象的序列化和反序列化方式,加载黑名单白名单,加载权限应用 ...

  9. Quartz详解和使用CommandLineRunner在项目启动时初始化定时任务

    文章目录 Quartz介绍 自定义CommandLineRunner类: 创建.更新定时任务 service层 自定义QuartzJobBean 智能调度组件 定时任务实体类: mapper接口: 时 ...

最新文章

  1. Elasticsearch之分词
  2. c++容器vector
  3. C#实现软键盘的几个关键技术实现方法
  4. [置顶] 我的iOS作品
  5. 简单理解极大似然估计MLE
  6. 你觉得一个人有几个手机号合适?
  7. python---post请求时其中dict中套有json
  8. 动画库tween.js
  9. oracle定时清理回收站,电脑设置定时清理回收站的操作方法
  10. “驱动程序在 \Device\Harddisk0\D 上检测到控制器错误”的根本解决办法!
  11. 西部数据移动硬盘哪个型号好_西部数据移动硬盘怎么样(西数移动硬盘系列区别)...
  12. Ansys workbench静应力分析基本流程
  13. 五十个产品可靠性性能提高的方法详解
  14. 计算机内存调用优化,Memory Cleaner——简单好用的Windows内存优化工具
  15. pc计算机属于第几代,i5 vPro是第几代?十一代vPro平台你了解吗?
  16. recon-ng V5.0 更新版本 被动信息收集
  17. 教授专栏33 | 黄阳光: 投资初创企业,应如何配置资源?
  18. 读写EEE、FLASH关键点<1>(MC9S12XEP100RMV1)
  19. 实时查看gpu利用率
  20. 使用kegg数据库的一点见解

热门文章

  1. Go Python 7: 2-Layer Neural Network
  2. BootstrapValidator验证
  3. vue 的常用模块安指令(持续记录)
  4. leetcode-114. Flatten Binary Tree to Linked List
  5. 报错:不是可以识别的内置函数名称
  6. 一个弹出页面的徐徐升起的js效果
  7. BookSmart Self Publishing
  8. Vue 项目上线优化
  9. 操作系统 --- [笔记]功能、组成
  10. 6 useRef、useImperativeHandle