通常前端数据与后端交互CRUD都用到同一个类,那如何控制每一个操作类型的验证呢?多的不说了直接贴代码

1、依赖支持

<!--  hibernate 验证框架validator  -->
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.1.5.Final</version>
</dependency>

2、通用类整理

public class ValidatorUtils {public static Validator validator(Boolean flag) {ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()//failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。.failFast(flag).buildValidatorFactory();return validatorFactory.getValidator();}/*** 功能描述:对象校验** @param obj       对象* @param classType 校验类型* @param flag      是否当出现一个属性错误就返回信息* @return java.lang.String* @date 2021/7/27*/public static <T> String getValidatorMessage(T obj, Class<?> classType, boolean flag) {Set<ConstraintViolation<Object>> validatorMessage = validator(flag).validate(obj, classType);return getSetMessage(new StringBuilder(), validatorMessage);}/*** 功能描述:属性校验(解决交互问题)** @param t             对象* @param classType     校验的类型* @param flag          是否当出现一个属性错误就返回信息* @param propertyNames 校验的属性* @return java.lang.String* @date 2021/7/27*/public static <T> String getValidatorMessage(T t, Class<?> classType, boolean flag, String... propertyNames) {StringBuilder stringBuilder = new StringBuilder();if (!ObjectUtils.isEmpty(propertyNames)) {for (String propertyName : propertyNames) {Set<ConstraintViolation<Object>> constraintViolations = validator(flag).validateProperty(t, propertyName, classType);getSetMessage(stringBuilder, constraintViolations);if (StringUtils.isNotBlank(stringBuilder.toString()) && propertyNames.length > 1) {stringBuilder.append(";");}if (StringUtils.isNotBlank(stringBuilder.toString()) && flag) {break;}}}return getErrorMessage(stringBuilder.toString());}/*** 功能描述:校验参数值** @param targetObject 目标对象* @param classType    校验类型* @param values       可变参数值* @return java.lang.String* @date 2021/7/27*/public static <T> String getValidatorMessage(Class<T> targetObject, Class<?> classType, String property, Object values) {StringBuilder stringBuilder = new StringBuilder();if (!ObjectUtils.isEmpty(property)) {Set<ConstraintViolation<T>> constraintViolations = validator(false).validateValue(targetObject, property, values, classType);getSetMessage(stringBuilder, constraintViolations);}return getErrorMessage(stringBuilder.toString());}/*** 功能描述:set集合处理** @param validatorMessage 校验失败信息* @return java.lang.String* @date 2021/7/27*/public static <T> String getSetMessage(StringBuilder stringBuilder, Set<ConstraintViolation<T>> validatorMessage) {if (!ObjectUtils.isEmpty(validatorMessage)) {String errorMessage = validatorMessage.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(";"));if (StringUtils.isNotBlank(errorMessage)) {stringBuilder.append(errorMessage);}}return stringBuilder.toString();}/*** 功能描述:去除最后一个;** @param errorMessage* @return java.lang.String* @date 2021/7/27*/private static String getErrorMessage(String errorMessage) {if (StringUtils.isNotBlank(errorMessage)) {if (errorMessage.indexOf(";") > 0) {errorMessage = errorMessage.substring(0, errorMessage.length() - 1);}}return errorMessage;}

3、创建自定义注解(标记作用)

这四个都一样

public @interface Add {}

4、在类中使用

注意(Query.class和Add.class是上面创建的自定义注解)

@Data
public class StudentDto {@NotBlank(message = "name不能为空",groups = {Query.class,Add.class})private String name;@NotNull(message = "age不能为空",groups = {Query.class})private Integer age;private String address;@NotNull(message = "birthday不能为空",groups = {Query.class})private String birthday;
}

5、使用案例

@PostMapping("/findOne")
public ResponseResult findOne(@RequestBody Student student){String validators = ValidatorUtils.getValidatorMessage(student, Query.class, false);if (StringUtils.isNotBlank(validators)){return ResponseResult.error(validators);}return ResponseResult.ok();
}@PostMapping("/findTwo")
public ResponseResult findTwo(@RequestBody Student student){String validators = ValidatorUtils.getValidatorMessage(student,Query.class,false,"name","age");if (StringUtils.isNotBlank(validators)){return ResponseResult.error(validators);}return ResponseResult.ok();
}@PostMapping("/findThree")
public ResponseResult findThree(@RequestBody Student student){String validators = ValidatorUtils.getValidatorMessage(student,Add.class,true,"name","age");if (StringUtils.isNotBlank(validators)){return ResponseResult.error(validators);}return ResponseResult.ok();
}@PostMapping("/findFour")
public ResponseResult findFour(@RequestBody Student student){String validators = ValidatorUtils.getValidatorMessage(student, Query.class, true);if (StringUtils.isNotBlank(validators)){return ResponseResult.error(validators);}return ResponseResult.ok();
}@GetMapping("/findFive")
public ResponseResult findFive(@RequestParam(value = "name")String name,@RequestParam(value = "age")String age){String validators = ValidatorUtils.getValidatorMessage(Student.class,Query.class,"name",name);if (StringUtils.isNotBlank(validators)){return ResponseResult.error(validators);}return ResponseResult.ok();
}

Hibernate 验证框架validator相关推荐

  1. hibernate validate验证框架中@NotEmpty、@NotbBank、@NotNull的区别

    Hibernate Validator验证框架中@NotEmpty.@NotBlank.@NotNull 的区别 Hibernate Validator验证框架中@NotEmpty.@NotBlank ...

  2. NHibernate.Validator 实体验证框架

    在系统开发时,很多情况下都需要对实体进行验证,比如规定某个属性值不能为空,Email的格式或者电话号码的格式是否正确.这种验证不应该只在UI层进行,主要有以下几方面的考虑:      1.如果每个层次 ...

  3. .Net Validator验证框架 [ .Net | Validator Framework | Attribute ]

    引: 具体地址忘记了,我是以前存在window live spaces 现在搬过来备份 (该文章在代码范例上有些说明不全,看附件来补充对 C# Attribute 的应用) 前言 简单易用是.Net ...

  4. jquery. Validator验证框架ajax返回json数据

    今天在使用jquery. Validator验证框架的过程中遇到了一个这个的问题: 我需要动态的去验证注册邮箱是否已经存在了,所以需要用到ajax请求来解决该问题.但在使用该验证框架的ajax异步请求 ...

  5. Validator验证框架

     5.4  Validator验证框架 Struts1.1及以上版本,在提供了动态ActionForm的同时,配合数据验证的需要,还提供了表单输入自动验证的功能,即使用Validator验证框架. ...

  6. SpringBoot-服务端参数验证-JSR-303验证框架

    1. springboot 默认集成了 hibernate-validator,它默认是生效的,可以直接使用. 比如: @RestController @RequestMapping("/h ...

  7. spring mvc + JSR-303验证框架

    为什么80%的码农都做不了架构师?>>>    http://www.cnblogs.com/liukemng/p/3738055.html 在系列(4).(5)中我们展示了如何绑定 ...

  8. JS验证框架的使用方法

    今天着重介绍的是JS验证框架在Java Web项目中的应用, JSValidation要去http://cosoft.org.cn/projects/jsvalidation中下载最新版本. JSVa ...

  9. Android非空格式验证框架Validation的使用---第三方库学习笔记(四)

    Validation简介: 这是一个简单的函数库,使用注释语法来验证用户输入的表单信息.你仅需编写几行代码就可以实现一些表单验证功能,且显示的所有视图都将反馈给用户.它还带有一个可扩展的在线验证选项, ...

最新文章

  1. Mac下sublime text2 解决中文乱码
  2. Current综述:中农宋春旭等为植物有益微生物组构建一个美好家园
  3. LeetCode 319. Bulb Switcher--C++,java,python 1行解法--数学题
  4. Postfix+Amavisd-new+Spamassassin+ClamAV整合安装
  5. android系统里面的mic是哪个app_苹果记事app哪个好用?这款便签可以跨系统使用...
  6. boost::mpi::wait_all相关用法的测试程序
  7. 模拟jquery链式访问
  8. Java基础教程:多线程基础(3)——阻塞队列
  9. 计算机专业专业课代号408,计算机专业考研你一定要知道的事情!
  10. Robocode教程4——Robocode的游戏物理
  11. Oracle 树操作、递归查询(select…start with…connect by…prior)
  12. Android 隐藏环形进度条,Android环形进度条
  13. 离散信号的希尔伯特变换的计算公式_离散信号的hilbert 变换.ppt
  14. 计算机中的云指的是什么,古语有云,古语有云中的云指的是什么
  15. Redis原生SET、SETNX、SETEX方法以及RedisTemplate的方法 + 分布式锁的实现
  16. 2020-04-15-52brain公众号目录【2020年3月】
  17. 【c51单片机】交通红绿灯设计
  18. mysql 入库乱码,如何解决mysql中文入库乱码问题
  19. 蚂蚁课堂视频笔记思维导图-3期 一、并发编程专题
  20. 华东师大计算机专硕学费,2021年华东师范大学硕士研究生学费标准公示

热门文章

  1. Nvidia-smi简介
  2. 【原创】【I2C】I2C介绍
  3. 删除 重复数据 mysql_mysql删除重复记录语句的方法
  4. Linux操作系统安装
  5. 中国教师研修网计算机培训心得体会,教师网络培训学习心得体会最新5篇精选...
  6. 欧洲通用数据保护条例(GDPR)合规的6个步骤
  7. (Note)HTTP常见状态码(Status Code)
  8. android 生成 QR_CODE 码 PFD_417码 CODE_36码
  9. 八大著名IT企业云计算策略(英文版)
  10. 锐捷客户端解除禁用多网卡设置(包括虚拟机和移动热点)