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

目录
相关文章
|
5天前
|
监控 安全 NoSQL
采用java+springboot+vue.js+uniapp开发的一整套云MES系统源码 MES制造管理系统源码
MES系统是一套具备实时管理能力,建立一个全面的、集成的、稳定的制造物流质量控制体系;对生产线、工艺、人员、品质、效率等多方位的监控、分析、改进,满足精细化、透明化、自动化、实时化、数据化、一体化管理,实现企业柔性化制造管理。
30 3
|
8天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
109 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
8天前
|
Java 数据库连接 数据库
Springboot整合mybatisPlus开发
MyBatis-Plus是一个MyBatis的增强工具,旨在简化开发和提高效率。它在不修改原有MyBatis的基础上提供额外功能。要将MyBatis-Plus集成到SpringBoot项目中,首先通过Maven添加mybatis-plus-boot-starter和相应数据库驱动依赖,然后配置application.yml中的数据库连接信息,并指定Mapper类的扫描路径。Mapper接口可继承BaseMapper实现基本的CRUD操作。
|
8天前
|
前端开发 JavaScript Java
Springboot框架整合jsp开发【干货满满】
该文介绍了如何在Spring Boot中集成JSP,需包含`spring-boot-starter-web`、`tomcat-embed-jasper`和`jstl`三个依赖。配置Spring Boot寻找JSP的位置,设置`spring.mvc.view.prefix`为`/WEB-INF/jsp/`,`spring.mvc.view.suffix`为`.jsp`。JSP文件应放在`src/main/webapp/WEB-INF/jsp/`下。
|
8天前
|
Web App开发 前端开发 Java
SpringBoot配置HTTPS及开发调试
在实际开发过程中,如果后端需要启用https访问,通常项目启动后配置nginx代理再配置https,前端调用时高版本的chrome还会因为证书未信任导致调用失败,通过摸索整理一套开发调试下的https方案,特此分享
22 0
SpringBoot配置HTTPS及开发调试
|
8天前
|
IDE Java 开发工具
Spring Boot DevTools:加速开发的热部署工具
【4月更文挑战第28天】在Spring Boot的开发过程中,快速反馈和效率至关重要。Spring Boot DevTools是一个为开发者设计的模块,支持热部署(hot swapping),能够实现应用的快速重启和自动重载,极大地提高了开发效率。本篇博客将介绍Spring Boot DevTools的核心概念,并通过具体的实战示例展示如何在开发过程中利用这一工具。
28 0
|
8天前
|
Java Maven Kotlin
[AIGC] 请你写一遍博客介绍 “使用idea+kotinlin+springboot+maven 结合开发一个简单的接口“,输出markdown格式,用中文回答,请尽可能详细
[AIGC] 请你写一遍博客介绍 “使用idea+kotinlin+springboot+maven 结合开发一个简单的接口“,输出markdown格式,用中文回答,请尽可能详细
|
8天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
219 10
|
8天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
36 0
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
8天前
|
开发框架 Java 测试技术
XwFast,我开发了一个基于SpringBoot和MyBatisPlus的敏捷开发框架!
XwFast,我开发了一个基于SpringBoot和MyBatisPlus的敏捷开发框架!
34 1