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时可以有更好的体验。

目录
相关文章
|
8天前
|
小程序 数据可视化 Java
Java+后端Spring boot 开发的全套UWB定位方案,0.1米高精度定位系统源码
UWB定位系统由硬件定位设备、定位引擎和应用软件组成。该定位系统应用软件支持PC端和移动端访问,并提供位置实时显示、历史轨迹回放、人员考勤、电子围栏、行为分析、智能巡检等功能。定位精度高达10cm,同时具备高动态、高容量、低功耗的优点。应用场景包括:隧道、化工、工厂、煤矿、工地、电厂、养老、展馆、整车、机房、机场等。
34 8
|
8天前
|
监控 数据管理 Java
智慧城管源码,基于微服务+java+springboot+vue+uniapp开发的城管综合执法系统源码
智慧城管执法系统利用微服务和Java技术提升城市管理水平,涵盖事件处理、投诉、处罚等功能,包含PC和APP源码。系统支持执法APP,便于领导随时随地审批,具备文书模板、地图定位、法规查询等功能。此外,执法办案系统通过监控视频分析事件,实现案件全程闭环管理,包括组织、案件、信用和执法队伍管理,以及法规库等基础支撑。系统旨在优化流程,提高数据管理和效率。
智慧城管源码,基于微服务+java+springboot+vue+uniapp开发的城管综合执法系统源码
|
9天前
|
监控 Java 数据库连接
Java一分钟之-Spring Boot:快速开发微服务
【6月更文挑战第7天】本文探讨了Spring Boot开发中的常见问题,包括起步依赖与版本管理、自动配置、启动类位置、日志配置、数据库连接、错误处理和Actuator监控。建议使用最新稳定版Spring Boot,通过`spring-boot-starter-parent`管理版本,理解自动配置原理,正确放置启动类,配置日志级别,准确设置数据库连接参数,自定义全局异常处理器,以及启用Actuator进行监控。不断学习和实践是应对各种问题的关键。
24 1
|
9天前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的外卖小程序的研究与开发的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的外卖小程序的研究与开发的详细设计和实现
12 0
|
10天前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的智慧旅游平台开发微信小程序的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的智慧旅游平台开发微信小程序的详细设计和实现
29 8
|
16天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的文化遗产的保护与旅游开发的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的文化遗产的保护与旅游开发的详细设计和实现(源码+lw+部署文档+讲解等)
|
18天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的水果网上商城的开发与设计的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的水果网上商城的开发与设计的详细设计和实现(源码+lw+部署文档+讲解等)
|
19天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的珠宝首饰交易平台开发的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的珠宝首饰交易平台开发的详细设计和实现(源码+lw+部署文档+讲解等)
|
19天前
|
JavaScript Java 测试技术
智慧旅游平台开发微信小程序+springboot+vue.js附带文章和源代码设计说明文档ppt
智慧旅游平台开发微信小程序+springboot+vue.js附带文章和源代码设计说明文档ppt
25 0
|
20天前
|
供应链 安全 Java
如何挑选一个合适的HIS系统? 基于B/S架构,JAVA语言,springboot最新技术栈开发的整套云HIS系统源码 HIS源码
最近有很多人在询问,有没有最优秀的HIS系统?在这里小编是没办法回答的。为什么呢?
39 0
如何挑选一个合适的HIS系统? 基于B/S架构,JAVA语言,springboot最新技术栈开发的整套云HIS系统源码 HIS源码