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 参数校验相关推荐

  1. Java代码简洁-validation参数校验

    validation参数校验 bean validation和hibernate validator参数校验 常用注解 1.导入依赖 2.测试 3.自定义消息模板 4.分组校验 5.级联校验 6.自定 ...

  2. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:六点半起床 juejin.im/post/685654110 ...

  3. Spring Validation 最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

  4. bean validation校验方法参数_SpringBoot参数校验 从入门到精通 解决繁琐的参数验证工作...

    ● 手把手教你实现 SpringBoot与Vue整合开发 前后端分离 简单例子 详解●SQL优化经历  SQL执行效率提高了1000w倍●Java面试题 详解 由易到难● SQL语句大全详解 增删改查 ...

  5. 使用 Spring Validation 优雅地进行参数校验

    引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(UserVO userVO) {if(user ...

  6. bean validation校验方法参数_Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    本文同名博客老炮说Java:https://www.laopaojava.com/,每天更新Spring/SpringMvc/SpringBoot/实战项目等文章资料 顺便再给大家推荐一套Spring ...

  7. springboot中参数校验(validation)使用

    文章目录 介绍: validation引入 可用约束(constraint) 应用实战 实体类 接口参数型 约束生效 实体型 介绍: 在开发中,会经常需要进行参数的校验,比如接口层.业务层.持久层等, ...

  8. Java参数校验validation和validator区别

    Java参数校验validation和validator区别 1. 参数校验概述 2. validation与validator区别 3. validation注解说明 4. validator注解说 ...

  9. springboot+dubbo+validation 进行 rpc 参数校验

    注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE 项目结构 test-rest (前端消费着,controller 层,springboot+maven项 ...

  10. Spring Validation实现原理,参数校验没那么简单

    前言 本文会详细介绍Spring Validation各种场景下的最佳实践及其实现原理,死磕到底! 项目源码:spring-validation 简单使用 Java API规范(JSR303)定义了B ...

最新文章

  1. Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  2. 使用Windows远程桌面(mstsc)通过RDP协议访问Ubuntu/Debian服务器
  3. 大数据技术在传统企业信息化的应用
  4. qt 中转化图片格式与大小的方法
  5. 反射和动态代理实现上下文切入AOP效果
  6. 2012年初的10个绝对让你惊喜的jQuery插件
  7. activiti 条件表达式json报错_2020年2月13日学习python 条件控制
  8. 【计算机系统设计】重点 · 学习笔记(1)(资源消耗)
  9. linux共享数据,使用Linux共享数据对象
  10. android监听方法的耗时时间,Android从网络获取北京时间以及动态的监听时间
  11. python银行排队系统_python-我需要基于Web的系统的消息/排队解决...
  12. 【经验分享】在研究中,你是否踩过这些工程的“坑”?
  13. 路由器开发相关知识总结 —— 光口和电口
  14. 企业员工考勤管理子系统
  15. InDesign转曲字体 导出PDF的技巧
  16. Lua学习(一):luac、luajit编译与反编译
  17. 618|Python购书攻略
  18. 最燃黑客情报官薛锋:端起AK伏特加,代表人民把坏人抓
  19. Knowledge Graph Embedding: A Survey of Approaches and Applications (2)
  20. css层叠样式的使用,CSS层叠样式表——使用CSS样式的方法

热门文章

  1. 物联网嵌入式系统开发应用软件公司怎么选择
  2. w ndows7怎么设置打印机,windows7中如何设置打印机纸张大小 以241-2纸张为例
  3. 华为OD(外包)社招技术二面,总结复盘
  4. linux通过ip查询域名,无法通过ip地址查找对应的域名
  5. foxmail添加网易企业邮箱账号遇到账号或密码错误的问题
  6. 申诉受理 - 工业和信息化部电信用户申诉受理中心 - PoweredCMSECMS
  7. 百度地图在项目应用示例
  8. 关于模板函数声明与定义的问题
  9. 伽罗华有限域的FEC
  10. Chrome浏览器取证分析