文章目录

  • 前言
  • 一、JSR303简介
  • 二、JSR303定义的注解
  • 三、Hibernate Validator定义的注解
  • 四、使用方式
    • 1、Hibernate Validator使用方法
    • 2、Spring Vlidation使用方法
    • 2、Dubbo Vlidation使用方法
  • 五、附录

前言

数据校验是系统接口对接、网站交互等场景不可或缺的功能,涉及页面交互的一般通过js在录入时进行校验,但是还是存在绕过前端校验的可能,还有系统间调用的接口,或者是其他意外情况绕过校验,而一旦系统中出现非法的数据,这对运维来说是件很头疼的事情,所以服务端的数据校验也是十分必要的,本文介绍的validation就是进行这样的数据校验。

一、JSR303简介

  • JSR-303/JSR-349 是JAVA EE 6 中的一项子规范,叫做Bean Validation。JSR-349 是其升级版本,添加了一些新特性,他们规定了一些校验规范即校验注解,如 @Null,@NotNull,@Pattern等,这些规范位于 JDK的javax.validation.constraints 包下,只提供规范不提供实现,包名validation-api-x.x.x.jar。
  • Hibernate Validator是JSR-303/JSR-349的主要实现,这里的Hibernate不是数据库ORM框架的Hibernate,他提供了基本的实现,并增加了一些其他校验注解,如 @Email,@Length,@Range 等等,他们位于 org.hibernate.validator.constraints 包下,包名hibernate-validator-x.x.x.jar。
  • Spring Vlidation是JSR-303/JSR-349的另外一种实现,Spring Vlidation是Spring给开发者提供的一个便捷的校验实现,它对Hibernate Validator进行了二次封装,在需要使用校验时,你可以选择使用Spring Vlidation或者Hibernate Validator,都能达到同样的目的,Spring Vlidation有一个特性,便是其在 SpringMVC 模块中添加了自动校验,并将校验信息封装进了特定的类中,这无疑便捷了我们的 web 开发。
  • JSR-303/JSR-349其他的实现还有Dubbo Validation,只要在Dubbo注册时配置validation = true,并在参数上使用 JSR303 标准的验证 annotation 就可以生效了。dubbo启用参数验证也要依赖hiberate-validator包,最终底层八成也是调用Hibernate Validator执行校验。

二、JSR303定义的注解

注解类型 功能描述
@Valid 被注释的元素是一个对象,需要检查此对象的所有字段值
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null,任何对象的value不能为null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式

三、Hibernate Validator定义的注解

注解类型 功能描述
@Email 被注释的元素必须是电子邮箱地址
@Length(min=, max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空,集合对象的元素不为0,即集合不为空,也可以用于字符串不为null
@Range(min=, max=) 被注释的元素必须在合适的范围内
@NotBlank 被注释的字符串的必须非空,只能用于字符串不为null,并且字符串trim()以后length要大于0
@URL(protocol=,host=, port=, regexp=, flags=) 被注释的字符串必须是一个有效的url
@CreditCardNumber 被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性
@ScriptAssert(lang=, script=, alias=) 要有Java Scripting API 即JSR 223 (“Scripting for the JavaTM Platform”)的实现
@SafeHtml(whitelistType=, additionalTags=) classpath中要有jsoup包

hibernate补充的注解中,最后3个不常用,可忽略

四、使用方式

以下是基本的使用方法,其他用法诸如分组校验、方法校验等读者可自行查阅相关文档学习,这里就不做介绍了。

1、Hibernate Validator使用方法

  • pom导入依赖项
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.18.Final</version><exclusions><exclusion><groupId>jakarta.validation</groupId><artifactId>jakarta.validation-api</artifactId></exclusion></exclusions>
</dependency>

或者直接导入Spring Boot提供的starter

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.4.5</version>
</dependency>
  • 添加注解
@Data
public class UserInfo {@javax.validation.constraints.NotNullprivate Long id;@javax.validation.constraints.NotEmptyprivate String name;@org.hibernate.validator.constraints.Rangeprivate Integer age;@javax.validation.constraints.Emailprivate String email;private LocalDate birthdate;
}
  • 使用校验
public void ValidatorTest {private Validator validator = Validation.buildDefaultValidatorFactory().getValidator();UserInfo userInfo = new UserInfo ();//如果校验对象userInfo 不通过,则存在校验不通过信息Set<ConstraintViolation<UserInfo>> set =   validator.validate(userInfo);set.stream().forEach(cv -> {System.out.println("属性:"+cv.getPropertyPath()+",属性值:"+cv.getInvalidValue()+",校验不通过,触发规则:"+cv.getMessage());});
}

2、Spring Vlidation使用方法

  • pom导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.4.5</version>
</dependency>
  • 添加注解
@Data
public class UserInfo {@javax.validation.constraints.NotNullprivate Long id;@javax.validation.constraints.NotEmptyprivate String name;@org.hibernate.validator.constraints.Rangeprivate Integer age;@javax.validation.constraints.Emailprivate String email;private LocalDate birthdate;
}
  • 使用@Valid/@Validated开启注解
Void updateUser(@RequestBody @Valid UserInfo req);

@Valid和@Validated区别的区别如下

  • 使用校验
    spring-mvc自动解析参数,并调用Hibernate Validator进行校验

2、Dubbo Vlidation使用方法

  • pom引入依赖项
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.10.Final</version>
</dependency>
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version>
</dependency>
  • 添加校验注解
  • 开启校验
<dubbo:reference id="validationService" interface="org.apache.dubbo.examples.validation.api.ValidationService" validation="true" />

只要在dubbo注册时配置validation = true,并在参数上使用 JSR303 标准的验证 annotation 就可以生效了

五、附录

这里分享一个Hibernate Validator方式校验常用工具类,在实际使用中,很多场景下都需要手动发起校验,例如批量导入对文件中数据的校验等,仅供大家参考。

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*** @description:自定义校验* @author Mr.bin* @date 2022/7/4*/
public class CustomValidator {private CustomValidator() {}private static Validator validator;static {validator = Validation.buildDefaultValidatorFactory().getValidator();}public static <T> Map<String,StringBuffer> validate(T obj){Map<String,StringBuffer> errorMap = null;Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class);if(set != null && set.size() >0 ){errorMap = new HashMap<String,StringBuffer>();String property = null;for(ConstraintViolation<T> cv : set){//这里循环获取错误信息,可以自定义格式property = cv.getPropertyPath().toString();if(errorMap.get(property) != null){errorMap.get(property).append("," + cv.getMessage());}else{StringBuffer sb = new StringBuffer();sb.append(cv.getMessage());errorMap.put(property, sb);}}}return errorMap;}public static <T> Map<String,StringBuffer> validate(T obj, Class<?>... groups){Map<String,StringBuffer> errorMap = new HashMap<>();Set<ConstraintViolation<T>> set = validator.validate(obj, groups);if(set != null && set.size() >0 ){errorMap = new HashMap<String,StringBuffer>();String property = null;for(ConstraintViolation<T> cv : set){//这里循环获取错误信息,可以自定义格式property = cv.getPropertyPath().toString();if(errorMap.get(property) != null){errorMap.get(property).append("," + cv.getMessage());}else{StringBuffer sb = new StringBuffer();sb.append(cv.getMessage());errorMap.put(property, sb);}}}return errorMap;}
}

Spring Boot使用JSR303校验相关推荐

  1. 【Spring Boot】数据校验

    文章目录 2. 数据校验 1. Hibernate Validator 2. JavaBean参数校验 3. URL参数校验 4. JavaBean 对象级联校验 5.分组校验 6. 声明自定义校验注 ...

  2. Spring Boot 如何优雅的校验参数?

    今天介绍一下 Spring Boot 如何优雅的整合JSR-303进行参数校验,说到参数校验可能都用过,但网上的教程大多是简单的介绍,所以我们今天详细看来一下 . 什么是 JSR-303? JSR-3 ...

  3. Spring Boot数据校验

    数据校验是一个相当重要的环节,使用Spring Boot 进行数据校验. 添加校验依赖 全部依赖文件如下 <?xml version="1.0" encoding=" ...

  4. 般若堂--Spring Boot系列之参数校验

    本章小宋带大家详细了解一下在Spring boot项目中,是怎么去验证参数的.话不多说直接进入学习时间. 目录 参数校验注解 相关依赖 实体类 一些常用的字段验证的注解 JSR提供的校验注解: Hib ...

  5. Spring Boot特性

    2019独角兽企业重金招聘Python工程师标准>>> SpringApplication SpringApplication类提供了一种从main()方法启动Spring应用的便捷 ...

  6. spring boot 的常用注解使用 总结

    附:Spring Boot 官方文档学习(一)入门及使用 见https://www.cnblogs.com/larryzeal/p/5799195.html @RestController和@Requ ...

  7. Spring Boot(5)---常用注解总结

    Spring Boot常用注解总结 @RestController和@RequestMapping注解 @RestController注解,它继承自@Controller注解.4.0之前的版本,Spr ...

  8. JSR303 校验失败

    错误原因 我分组了,但是controller方法参数用的是注解@Valid,而且改成@Validated之后忘记指定分组了.. 导致根本就没有校验. 补充 1.是否导包 (我的是Spring Boot ...

  9. Spring Boot 2.X 对 web 的开发支持(二)

    Spring Boot 2.X 对 web 的支持开发 上章节的 Spring Boot 的入门案例,我们感受到 Spring Boot 简单的配置即可运行项目. 今天了解 Spring Boot 对 ...

最新文章

  1. [转]Chrome 控制台console的用法
  2. 自动化测试8大元素定位之xpath语法
  3. C语言线性插值lerp算法(附完整源码)
  4. How to resolve ATC error message Package Violation (Error) - Missing Use Access (USEM)
  5. 面试中关于String、StringBuffer、StringBuilder的频率最高问题
  6. 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT
  7. 特殊年份(java)
  8. webservices系列(三)——调用线上webservice(天气预报和号码查询)
  9. 转载:VS2005 工具方便实用的快捷键。
  10. Hbase常用shell
  11. Python代码格式化规范
  12. html中好看的英文字体,一组漂亮的英文字体在线演示
  13. 200个英语常用词根词缀
  14. QQ桌球瞄准器开发(1)桌球瞄准器介绍与使用方法
  15. 电脑重装win10系统教程,简单易懂,不用U盘直接重装
  16. 商城订单实时语音提醒功能JavaScript部分 附提醒语音音频文件
  17. TestNG-学习笔记
  18. 苹果Home键恢复(无工具篇)
  19. 自研代码率超70%,国产大数据基础软件第一股星环科技成功上市!
  20. Python-接口自动化流程(pytest)

热门文章

  1. 初学Java的第一天
  2. Docker EOF
  3. EXCEL 选定区间STDEV AVERAGEIF
  4. php include怎么用,include()使用方法
  5. 微服务介绍(史上最全)
  6. Python爬虫从入门到精通:(42)JS逆向-闭包:凡科网逆向分析_Python涛哥
  7. 《线性代数》随笔:青出于蓝
  8. linux shell grep 判断,Linux | grep用于if逻辑判断
  9. 随着云计算的发展,传统的数据中心逐渐转向虚拟化数据中心
  10. JAVA人物转体怎么实现_与C++语言不同,Java语言不通过____语句实现跳转