Spring Boot 参数校验
1、背景介绍
开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码
这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已。
接下来,用Validation来改写这段
2、Spring Boot文档中的Validation
在Spring Boot的官网中,关于Validation只是简单的提了一句,如下
其实,Spring Validator和Hibernate Validator是两套Validator,可以混着用,这里我们用Hibernate Validator
3、Hibernate Validator
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#preface
4、Spring Validator
https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#validation
5、示例
5.1、引入spring-boot-starter-validation
5.2、定义一个对象
5.3、适用@Valid校验,并将校验结果放到BindingResult对象中
注意:
- 默认情况下,如果校验失败会抛javax.validation.ConstraintViolationException异常,可以用统一异常处理去对这些异常做处理
- An Errors/BindingResult argument is expected to be declared immediately after the model attribute
5.4、看效果
如果在校验的对象后面再加上Model对象的话,如果返回的是ModelAndView就可以将这个Model设置到其中,这样在页面就可以取到错误消息了
仅仅只是单字段校验的话未免也太不灵活了吧,如果字段之间有关联关系,那该如何校验呢?答案是自定义
5.5、自定义校验规则
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-customconstraints
这里,以优惠券创建为例来演示如何自定义校验规则
首先,优惠券表单如下(仅仅只是演示用):
这里除了自定义了两条校验规则之外,还用到了分组。
为什么要有分组这一说呢?因为,举个例子,添加的时候不需要校验id,而修改的时候id不能为空,有了分组以后,就可以添加的时候校验用组A,修改的时候校验用组B
下面重点看一下@CheckTimeInterval
第一步、定义一个注解叫CheckTimeInterval
第二步、定义Validator去校验它
顺便提一句,这里BeanWrapper去取对象的属性值,我们稍微看一下BeanWrapper是做什么的
言归正传
第三步、验证
看,自定义的校验生效了
6、补充
6.1、校验模式
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-fail-fast
下面补充一点,关于校验模式
默认会校验完所有属性,然后将错误信息一起返回,但很多时候不需要这样,一个校验失败了,其它就不必校验了
为此,需要这样设置
6.2、单个参数校验
如果是调整页面的时候参数校验失败的话,这时可以不做处理,让其调到错误页面。
如果是接口参数校验失败的话,可以在这里进行统一处理,并返回。例如:
6.3、错误页面
以刚才优惠券详情为例
http://localhost:8080/coupon/detail.html 400
http://localhost:8080/coupon/detail.html?id= 400
http://localhost:8080/coupon/detail.html?id=abc 400
http://localhost:8080/coupon/detail222.html?id=123 404
无权限 403
int a = 1 / 0; 500
6.4、@Valid与@Validated
https://blog.csdn.net/qq_27680317/article/details/79970590
参考
http://rensanning.iteye.com/blog/2357373
https://blog.csdn.net/kenight/article/details/77774465
https://www.cnblogs.com/mr-yang-localhost/p/7812038.html
https://www.phpsong.com/3567.html
https://www.cnblogs.com/mr-yang-localhost/p/7812038.html
Spring Boot 参数校验的更多相关文章
- Validated 注解完成 Spring Boot 参数校验
1. @Valid 和 @Validated @Valid 注解,是 Bean Validation 所定义,可以添加在普通方法.构造方法.方法参数.方法返回.成员变量上,表示它们需要进行约束校验. ...
- Spring Boot参数校验
1. 概述 作为接口服务提供方,非常有必要在项目中加入参数校验,比如字段非空,字段长度限制,邮箱格式验证等等,数据校验常用到概念:JSR303/JSR-349: JSR303是一项标准,只提供规范不提 ...
- spring boot输入数据校验(validation)
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- spring boot 参数传递(spring boot 参数传数 arg0 每一个参数 arg0#{arg0},arg1 #{arg1})
spring boot 参数传数 arg0 每一个参数 arg0#{arg0},arg1 #{arg1} @Select("select * from sys_user where nam ...
- Spring Boot (一) 校验表单重复提交
一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...
- 59. Spring Boot Validator校验【从零开始学Spring Boot】
大纲: (1) 入门例子: (2) 国际化: (3) 在代码中添加错误信息: (1) 入门例子: Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数 ...
- spring mvc参数校验
一.在SringMVC中使用 使用注解 1.准备校验时使用的JAR validation-api-1.0.0.GA.jar:JDK的接口: hibernate-validator-4.2.0.Fina ...
- spring boot参数验证
必须要知道 简述 JSR303/JSR-349,hibernate validation,spring validation 之间的关系 JSR303 是一项标准,JSR-349 是其的升级版本,添加 ...
- Spring boot validation校验
使用 Hibernate validator 的步骤:1. 在 Pojo 类的字段上, 加上 Hibernate validator 注解2. 在Controller 函数的形参前加上 @Valid ...
随机推荐
- 云计算学习(5-1)云平台产品介绍-华为的FusionCloud产品
FusionSphere云平台:继承了虚拟化和云管理系统,为企业构建私有云 FusionManager:云管理平台(管理计算虚拟化.网络虚拟化.存储虚拟化) FusionCompute.Fusion ...
- 新概念英语(1-19)Tired and thirsty
新概念英语(1-19)Tired and thirsty Why do the children thank their mother? A:What's the matter, children? ...
- MySQLdb、 flask-MySQLdb 、MySQL-python 安装失败
今天在学习flask的时候,学习到数据库部分,连接mysql生成表,运行程序报错误:No module named MySQLdb 此时 需要安装 以下两个中任何一个 pip install flas ...
- IT 必备电脑快捷键
IT 必备电脑快捷键 键盘上除了有字母.数字之外,还有一些特殊的按键:ctrl.shift.alt.tab ● ctrl键是英语control“控制”的意思,这个按键,单独按没有任何作用,都要和其他的 ...
- Python_fullstack_test1
1.执行Python脚本的两种方式 使用交互式的带提示符的解释器或使用源文件 2.简述位.字节的关系 位是计算机中最小计量单位,用bit表示 字节是计算机中最小存储单位,用Byte表示 1字节=8位, ...
- Python无法导入Cython的.pyx文件
在import 相应包之前, 添加: import pyximport pyximport.install() 即可.
- MySQL 5.7 基于复制线程SQL_Thread加快恢复的尝试
1. MySQL 数据恢复常用办法 MySQL恢复的方法一般有三种: 1. 官方推荐的基于全备+binlog , 通常做法是先恢复最近一次的全备,然后通过mysqlbiinlog --start-po ...
- css befroe after 尾类技术器
CSS counter计数器(content目录序号自动递增)详解 这篇文章发布于 2014年08月26日,星期二,15:54,归类于 css相关. 阅读 44148 次, 今日 11 次 by zh ...
- Spring Boot 之Hello Word
Spring Boot官网:http://projects.spring.io/spring-boot/ 环境准备:maven 3.3.5.jdk8.Idea 1.创建maven项目工程 2.引入st ...
- 用Python浅析股票数据
用Python浅析股票数据 本文将使用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系,最后使用移动平均线方法初探投资策略. 数据导入 这里将股票数据存储在stockData ...