SpringBoot 开发秘籍 - 启动时配置校验

简介: 在项目开发过程中,某个功能需要依赖在配置文件中配置的参数。

概述


在项目开发过程中,某个功能需要依赖在配置文件中配置的参数。这时候就可能出现下面这种现象问题:


有时候经常出现项目启动了,等到使用某个功能组件的时候出现异常,提示参数未配置或者bean注入失败。


有没有一种方法在项目启动时就对参数进行校验而不是在实际使用的时候再抛出提示呢?


答案就是使用Spring提供的Java Validation功能,简单实用。


增加启动校验


只需要在我们创建的配置Properties类增加Validation相关配置即可


@Validated@Data@ConfigurationProperties(prefix="app")
@ComponentpublicclassAppConfigProperties {
@NotEmpty(message="配置文件配置必须要配置[app.id]属性")
privateStringid;
}


上面的配置就会校验我们在 application.yml中有没有配置 app.id参数。如果在配置文件中没有该配置,项目启动就会失败,并抛出校验异常。


在使用配置文件校验时,必须使用@configurationproperties注解,@value不支持该注解。


在需要使用app.id的时候注入配置类即可:


@AutowiredprivateAppConfigPropertiesappConfigProperties;


这样就可以实现我们想要的效果,如下图:


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9QeE16VDBPaWJmNGdUNWhvTkM0U2VpYWFaVUkzWVJqTGljTjNhb1FFa0ZaUEpMeThlaG45c1Zvc3JCVE1ZUGJYamljRGliWlJhbXhCdWQxWEJGU2daVEloTWNnLzY0MA.png


效果


校验类型


校验规则 规则说明
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 验证注解的元素值(日期类型)比当前时间早
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式


Validation 支持如下几种校验,可以满足基本的业务逻辑,当然如果还是满足不了你的业务逻辑,可以选择定制校验规则

定制校验逻辑


  1. 定义校验逻辑规则,实现 org.springframework.validation.Validator


publicclassConfigPropertiesValidatorimplementsValidator {
@Overridepublicbooleansupports(Class<?>aClass) {
returnAppConfigProperties.class.isAssignableFrom(aClass);
    }
@Overridepublicvoidvalidate(Objecto, Errorserrors) {
AppConfigPropertiesconfig= (AppConfigProperties) o;
if(StringUtils.isEmpty(config.getId())){
errors.rejectValue("id", "app.id.empty", "[app.id] 属性必须要在配置文件配置");
        }elseif (config.getId().length() <5) {
errors.rejectValue("id", "app.id.short", "[app.id] 属性的长度必须不能小于5");
        }
    }
}


  1. 使用自定义校验规则就不需要在使用原生的@NotEmpty了,将其删除


@Validated@Data@ConfigurationProperties(prefix="app")
@ComponentpublicclassAppConfigProperties {
//    @NotEmpty(message = "配置文件配置必须要配置[app.id]属性")privateStringid;
}


  1. 注入自定义校验规则


@BeanpublicConfigPropertiesValidatorconfigurationPropertiesValidator(){
returnnewConfigPropertiesValidator();
}


「注意:这里bean的方法名必须要 configurationPropertiesValidator,否则启动的时候不会执行该校验」


  1. 修改app.id配置,观察启动情况


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9QeE16VDBPaWJmNGdUNWhvTkM0U2VpYWFaVUkzWVJqTGljTmxrVVduUEEzNUZYQmo2OWhxSHBoTG9jbHloc3JWMlpLSGw1dWlhNGpZTFE5UDg3SjNlT2RFMEEvNjQw.png


测试验证结果


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


小结


通过配置Spring Boot启动校验功能,可以快速的识别参数配置的错误,避免在使用组件的时候才发现问题,可以减少排查问题的工作量,并且在我们封装自定义的starter时可以有更好的体验。

目录
相关文章
|
1月前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
50 0
|
6天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
52 13
|
14天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
25天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
38 2
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
39 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
JavaScript 前端开发 Java
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
21 0
|
2月前
|
开发框架 Java API
「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架
「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架
96 0
|
2月前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。
|
2月前
|
JavaScript 前端开发 数据可视化
【SpringBoot+Vue项目实战开发】2020实时更新。。。。。。
【SpringBoot+Vue项目实战开发】2020实时更新。。。。。。
60 0
|
2月前
|
前端开发 JavaScript Java
【SpringBoot系列】视图解析器的搭建与开发
【SpringBoot系列】视图解析器的搭建与开发
40 0