文章目录

  • 需求
  • 三部曲
    • Step1 Properties类搞上Validation相关配置
    • Step2 启动测试
    • Step3 配上试试
  • 自定义校验规则
    • Step1 搞接口实现
    • Step 2 搞属性文件
    • Step 3 搞自定义校验规则
    • Step 4 验证一把
  • 源码


需求

有个参数非常非常非常非常非常重要,如果未配置 或者 配置不正确, 不能启动应用。

我们使用Spring提供的Java Validation功能来实现这个“牛逼”的需求


三部曲

Step1 Properties类搞上Validation相关配置

package com.artisan.startvalidator.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;import javax.validation.constraints.NotEmpty;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world*/@Validated
@Component
@Data
@ConfigurationProperties(prefix = "artisan")
public class ArtisanConfigProperties {@NotEmpty(message = "必须配置[artisan.code]属性")private String code;}

上面的配置就会校验在application配置文件中有没有配置artisan.code 。若没有配置,项目启动就会失败,并抛出校验异常。

温馨小提示: 在使用配置文件校验时,必须使用@configurationproperties注解,@value不支持该注解

Step2 启动测试


Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'artisan' to com.artisan.startvalidator.config.ArtisanConfigProperties failed:Property: artisan.codeValue: nullReason: 必须配置[artisan.code]属性

Step3 配上试试

随便搞个测试

当然了,根据你的需求,你也可以用框架提供的其他注解

校验规则 规则说明
@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格式

自定义校验规则

当上面这些注解都满足不了你的时候…

那干脆自定义一个

Step1 搞接口实现

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

package com.artisan.startvalidator.validator;import com.artisan.startvalidator.config.ArtisanConfigProperties;
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world*/
public class ArtisanCustomConfigPropertiesValidator implements Validator {@Overridepublic boolean supports(Class<?> clazz) {// 父类.class.isAssignableFrom(子类.class)return ArtisanConfigProperties.class.isAssignableFrom(clazz);}@Overridepublic void validate(Object target, Errors errors) {ArtisanConfigProperties config = (ArtisanConfigProperties) target;if (StringUtils.isEmpty(config.getCode())) {errors.rejectValue("code", "artisan.code.empty", "[artisan.code] 属性必须要在配置文件application.properties中配置");} else if (config.getCode().length() < 8) {errors.rejectValue("id", "artisan.code.short", "[artisan.code] 属性的长度需要大于8");}}
}

Step 2 搞属性文件

使用自定义校验规则就不需要在使用原生的@NotEmpty了, 删除即可

Step 3 搞自定义校验规则

注入自定义校验规则, 写个配置类,@Bean一把

package com.artisan.startvalidator.config;import com.artisan.startvalidator.validator.ArtisanCustomConfigPropertiesValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world*/@Configuration
public class AppConfiguration {/*** bean的方法名必须要 configurationPropertiesValidator,否则启动的时候不会执行该校验** @return*/@Beanpublic ArtisanCustomConfigPropertiesValidator configurationPropertiesValidator() {return new ArtisanCustomConfigPropertiesValidator();}
}

bean的方法名必须要 configurationPropertiesValidator,否则不生效。

Step 4 验证一把

改改application.properties 的 artisan.code

不配置试一下

可以看到错误信息就是自定义校验的输出


源码

https://github.com/yangshangwei/boot2

SpringBoot - 优雅的实现【应用启动参数校验】相关推荐

  1. SpringBoot - 优雅的实现【自定义参数校验】高级进阶

    文章目录 Pre 概述 三部曲 Step1 搞自定义注解 Step2 搞校验逻辑 Step3 使用 Step4 验证 附 int 类型的判断 源码 Pre SpringBoot - 优雅的实现[参数校 ...

  2. SpringBoot全局异常处理及前端请求参数校验

    SpringBoot全局异常捕获处理及参数校验 文章目录 SpringBoot全局异常捕获处理及参数校验 为什么要用全局异常处理? 如何进行全局异常捕获和处理? 统一结果封装 统一返回结果 枚举类 使 ...

  3. SpringBoot→整合数据层、@Valid参数校验、事务propagation属性、动态SQL、AOP监控执行时间

    整合hicariCP数据源 整合Mybatis Hibernate校验注解 构建对象查询 @Transational事务propagation属性 自定义SQL查询 Mybatis配置控制台打印LOG ...

  4. Validator 参数校验springboot整合Validator,自定义手机号参数校验

    https://blog.csdn.net/m0_46425463/article/details/108006414

  5. SpringBoot - 优雅的实现【参数分组校验】高级进阶

    文章目录 Pre 需求 实现三部曲 Step1 定义分组接口 Step2 给参数分配分组 Step3 指定分组 Step4 验证 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...

  6. SpringBoot - 优雅的实现【参数校验】高级进阶

    文章目录 Pre 概述 参数校验三部曲 Step1 搞依赖 Step2 搞参数校验的实体类 常用的校验注解 Step3 开始验证 存在的问题 使用 统一格式 + 全局异常Handler 优化 源码 P ...

  7. SpringBoot - 优雅的实现【业务校验】高级进阶

    文章目录 Pre 需求 实现三部曲 实体类 Step1 搞两个自定义注解 Step2 搞自定义校验器 Step3 搞验证 小结 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...

  8. Spring基础系列-参数校验

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9953744.html Spring中使用参数校验 概述 ​ JSR 303中提出了Bea ...

  9. springboot 优雅的参数校验_SpringBoot 2.x 开发案例之优雅的校验参数

    前言 参数如何校验?撸主很久很久之前的项目都是在前端页面一个个 if else 的,后来就用了一系列的前端校验框架,比如 layui iview 等等,几个样式属性就可以轻松搞定,的确是美滋滋. 后端 ...

最新文章

  1. 13、Java菜单条、菜单、菜单项
  2. UA MATH566 统计理论 QE练习 位置变换后的指数分布
  3. Python:数组添加数据和删除数据
  4. html5怎么设置drop,HTML5 拖放(Drag 和 Drop)
  5. workerman php访问,workerman 配置域名访问 (本地)
  6. 用于科研的移动机器人平台推荐
  7. 上一页下一页_多页PDF文件也能很快合为一页PDF文件?这个小技巧可以办到
  8. 《OpenGL编程指南(原书第8版)》——计算着色器
  9. Python - WebDriver 识别登录验证码
  10. Android面试准备20190422
  11. 360se html怎么删除,如何卸载360浏览器?怎么彻底删除360浏览器?
  12. 高校邦HTML5,高校邦视频自动播放器
  13. css 之水平居中对齐
  14. 树莓派USB摄像头的使用
  15. 1、RPC框架解析:开篇-什么是RPC?
  16. 修改安卓默认的系统button样式,以及其它系统控件的默认样式
  17. 不得转载可以转发吗_微信公众号可以复制转载别人的文章吗?如何转发其他公众号文章?...
  18. aria2c指定下载存储路径的一个问题(可能不算bug)
  19. 旋转编码器(STM32)
  20. 【macOS Catalina 10.15.X(19xx)原版镜像合集】

热门文章

  1. java 学习心得 (近期的)
  2. zip() python
  3. ubuntu~vim操作
  4. 论文笔记:Weighted Graph Cuts without Eigenvectors:A Multilevel Approach
  5. Scrapy实战篇(二)之爬取链家网成交房源数据(下)
  6. MATLAB基本操作(一):MATLAB中变量的文件存储
  7. python 系统进程_在Python中监视所有系统进程
  8. LeetCode-剑指 Offer 27. 二叉树的镜像
  9. java中最容易犯错的特殊字符
  10. spring mvc使用的一些注意事项