Validation 参数校验
Validation 参数校验
不局限于controller的限制,可以在任何场景下,使用注解的方式对DTO进行参数校验,
由于spring-web-stater中已包含了 相关的依赖,如果是web工程,无需单独引入依赖。
注解
使用注解标注在DTO的指定字段上,改字段必须满足注解所要求的属性,否则将无法通过校验。javax所提供的校验相关的注解有(只列举常用注解)
@NotNUll 参数不能为空 @Null 参数对象必须为空@AsertFalse 断言为false @AsertTrue 断言为true@DecimalMax 验证对象是否小于等于指定的值,小数存在精度 @BigdecimelMin 验证对象是否大于指定的值,小数存在精度 @Min 验证对象是否大于指定的值 @Max 验证对象是都小于指定的值@size 验证对象长度是否再指定的范围内(array,collection,map,string)@Pattera 正则表达式校验 @Email 邮箱校验
示例
/*** 最大公里数*/@NotNull(message = "最大公里数不能为空")@Min(value = 0, message = "最大里程取值范围[0~99]")@Max(value = 99, message = "最大里程取值范围[0~99]")private Long maxDistance;/*** 车型映射*/@NotNull(message = "车型映射不能为空")private Integer truckMapper;/*** 价格系数*/@NotNull(message = "价格系数不能为空", groups = {PriceDiscount.class})@DecimalMin(value = "1.0", message = "价格系数不能小于1", groups = {PriceDiscount.class})@DecimalMax(value = "20.0", message = "价格系数不能大于20", groups = {PriceDiscount.class})@Digits(integer = 2, fraction = 1, message = "仅支持一位小数", groups = {PriceDiscount.class})private java.lang.Float priceDiscount;
配置 validator
private static ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()//快速失败.failFast(true).buildValidatorFactory();private static Validator validator = validatorFactory.getValidator();
校验
普通校验
使用配置好的validator对加了注解的DTO进行校验,默认的校验组为default 失败信息会返回成一个set集合
Set<ConstraintViolation<T>> set = validator.validate(object, Default.class);if (CollectionUtils.isEmpty(set)) {return YmmResult.succResult();}String msg = "参数错误";Iterator<ConstraintViolation<T>> it = set.iterator();if (it.hasNext()) {msg = it.next().getMessage();}return YmmResult.failResult(ErrorCodeEnum.PARAM_ERROR.getCode(), msg);
遍历这个错误信息集合的set就可以获取到全部的未通过校验的信息
(如果配置了失败快速返回,只会有一条失败信息)
分组校验
很多时候我们的一个方法并不需要对DTO中的全部方法进行校验,只需要校验当前方法需要使用到的某些属性,这个时候就可以使用分组校验使代码更加灵活
定义分组
定义类或者接口用来指定分组,这里选择在类中定义接口,方便统一管理
public class ValidationGroup {public interface group1{}public interface group2{} }
字段指定校验组
字段上group指定教研组,只有当validator入参为该校验组时,才会对字段进行这个校验,否则,不会校验
@DecimalMax(value = "20", message = "price should not more than 20",groups = ValidationGroup.group1.class)@DecimalMin(value = "0", message = "price should not less than 0")private Float price;//校验Set<ConstraintViolation<ValidationDto>> validate = validator.validate(build, ValidationGroup.group1.class);
校验组继承
validator中如果指定了校验组为group1,其他校验组的规则都不会生效(未指定校验组的为默认校验组default,也不会生效),如果想让group1具有default的验证规则,只需要指定接口group1继承default
public class ValidationGroup {public interface group1 extends Default{}public interface group2{} }
常见问题
Validation 参数校验相关推荐
- Java代码简洁-validation参数校验
validation参数校验 bean validation和hibernate validator参数校验 常用注解 1.导入依赖 2.测试 3.自定义消息模板 4.分组校验 5.级联校验 6.自定 ...
- Spring Validation最佳实践及其实现原理,参数校验没那么简单!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:六点半起床 juejin.im/post/685654110 ...
- Spring Validation 最佳实践及其实现原理,参数校验没那么简单!
之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...
- bean validation校验方法参数_SpringBoot参数校验 从入门到精通 解决繁琐的参数验证工作...
● 手把手教你实现 SpringBoot与Vue整合开发 前后端分离 简单例子 详解●SQL优化经历 SQL执行效率提高了1000w倍●Java面试题 详解 由易到难● SQL语句大全详解 增删改查 ...
- 使用 Spring Validation 优雅地进行参数校验
引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(UserVO userVO) {if(user ...
- bean validation校验方法参数_Spring Validation最佳实践及其实现原理,参数校验没那么简单!
本文同名博客老炮说Java:https://www.laopaojava.com/,每天更新Spring/SpringMvc/SpringBoot/实战项目等文章资料 顺便再给大家推荐一套Spring ...
- springboot中参数校验(validation)使用
文章目录 介绍: validation引入 可用约束(constraint) 应用实战 实体类 接口参数型 约束生效 实体型 介绍: 在开发中,会经常需要进行参数的校验,比如接口层.业务层.持久层等, ...
- Java参数校验validation和validator区别
Java参数校验validation和validator区别 1. 参数校验概述 2. validation与validator区别 3. validation注解说明 4. validator注解说 ...
- springboot+dubbo+validation 进行 rpc 参数校验
注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE 项目结构 test-rest (前端消费着,controller 层,springboot+maven项 ...
- Spring Validation实现原理,参数校验没那么简单
前言 本文会详细介绍Spring Validation各种场景下的最佳实践及其实现原理,死磕到底! 项目源码:spring-validation 简单使用 Java API规范(JSR303)定义了B ...
最新文章
- Dubbo 整合 Pinpoint 做分布式服务请求跟踪
- 使用Windows远程桌面(mstsc)通过RDP协议访问Ubuntu/Debian服务器
- 大数据技术在传统企业信息化的应用
- qt 中转化图片格式与大小的方法
- 反射和动态代理实现上下文切入AOP效果
- 2012年初的10个绝对让你惊喜的jQuery插件
- activiti 条件表达式json报错_2020年2月13日学习python 条件控制
- 【计算机系统设计】重点 · 学习笔记(1)(资源消耗)
- linux共享数据,使用Linux共享数据对象
- android监听方法的耗时时间,Android从网络获取北京时间以及动态的监听时间
- python银行排队系统_python-我需要基于Web的系统的消息/排队解决...
- 【经验分享】在研究中,你是否踩过这些工程的“坑”?
- 路由器开发相关知识总结 —— 光口和电口
- 企业员工考勤管理子系统
- InDesign转曲字体 导出PDF的技巧
- Lua学习(一):luac、luajit编译与反编译
- 618|Python购书攻略
- 最燃黑客情报官薛锋:端起AK伏特加,代表人民把坏人抓
- Knowledge Graph Embedding: A Survey of Approaches and Applications (2)
- css层叠样式的使用,CSS层叠样式表——使用CSS样式的方法