服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Spring 中@Validated 分组校验的使用解析

Spring 中@Validated 分组校验的使用解析

2022-02-23 13:10妖四灵.Shuen Java教程

这篇文章主要介绍了Spring 中@Validated 分组校验的使用解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Spring @Validated分组校验的使用

通过本文你能学习到@Validated 的基本使用,以及如何再spring-boot 中进行数据异常的统一处理

Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。

在检验入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同,总体来说@validated 相当于 @Valid 验证的升级版,功能更加强大。

接下来我们直接看下如何使用

引入POM依赖

      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>5.2.4.Final</version>
      </dependency>

定义公共分组class(用于标记分组,可以像后面定义在Vo里面,但是建议一些常用的定义在外部),如下

public interface Add {
}
public interface Edit {
}

Spring 中@Validated 分组校验的使用解析

定义接收数据的Vo

注意注解中分组的的使用,为了演示,同时在内部定义了一个特殊分组类

import com.example.jsr.commmon.Add;
import com.example.jsr.commmon.Edit;
import org.hibernate.validator.constraints.NotBlank; 
import javax.validation.constraints.Pattern; 
public class ParamsVo {

  //特殊用于修改年龄 标记使用 灵活放置位置
  public interface ModifyAge {
  }

  //年龄是1-120之间有效
  public static final String AGE_REG = "/^(?:[1-9][0-9]?|1[01][0-9]|120)$/";

  @NotBlank(
          groups = {Edit.class, ParamsVo.ModifyAge.class},
          message = "失败,id不能为空"
  )
  private String id;

  @NotBlank(groups = {Edit.class, Add.class}, message = "失败,名字不能为空")
  private String name;

  //自定义一个正则
  @NotBlank(groups = {Add.class, ParamsVo.ModifyAge.class},
          message = "失败,请填写age"
  )
  @Pattern(regexp = AGE_REG,groups = {Add.class, ParamsVo.ModifyAge.class},
          message = "失败,请填写正确age"
  )
  private String age; 
  ...省略setter getter 方法....
}

统一异常处理类

import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
* 全局异常处理
*/
@ControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(BindException.class)
  @ResponseBody
  public String handlerUnexpectedTypeException(BindException ex){
      BindingResult result = ex.getBindingResult();
      if (result.hasErrors()) {
          FieldError fieldError = result.getFieldError();
          if (fieldError != null) {
              return fieldError.getDefaultMessage();
          }
      }
      return "失败,请刷新重试";
  } 
  @ExceptionHandler(Exception.class)
  @ResponseBody
  public String handlerException(Exception ex){
      ex.printStackTrace();
      return "失败,请刷新重试";
  }
}

测试类

import com.example.jsr.Vo.ParamsVo;
import com.example.jsr.commmon.Add;
import com.example.jsr.commmon.Edit;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/validated/test")
public class ValidatedTestController {

  @RequestMapping("/add")
  @ResponseBody
  public String add(
          @Validated(Add.class)ParamsVo paramsVo){
      System.out.println(String.format("add obj = {%s}",paramsVo.toString()));
      return "success";
  } 
  @RequestMapping("/edit")
  @ResponseBody
  public String editAll(
          @Validated({Edit.class,ParamsVo.ModifyAge.class})ParamsVo paramsVo){
      System.out.println(String.format("edit obj = {%s}",paramsVo.toString()));
      return "success"; 
  }
}

页面效果测试

不填age

Spring 中@Validated 分组校验的使用解析

填入一个错误age

Spring 中@Validated 分组校验的使用解析

到此为止,基本的使用相信也是没有问题了

 

使用@Validated分组遇到的坑

在使用@Validate注解分组校验时,如果指定分组,所有的需要验证的属性都必须添加指定分组才会校验

Spring 中@Validated 分组校验的使用解析

Spring 中@Validated 分组校验的使用解析

解决办法

没有指明分组的属性都属于Default,所以分组接口继承Default就可以解决

Spring 中@Validated 分组校验的使用解析

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://shuen.blog.csdn.net/article/details/107099859

延伸 · 阅读

精彩推荐
  • Java教程Spring单数据源的配置详解

    Spring单数据源的配置详解

    spring数据源的配置网络上有很多例子,这里我也来介绍一下单数据源配置的例子,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    程序员阿牛10652021-12-05
  • Java教程浅析JAVA 循环结构

    浅析JAVA 循环结构

    这篇文章主要介绍了JAVA 循环结构的相关资料,文中讲解的非常细致,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    菜鸟教程4512020-07-19
  • Java教程java 桥模式(Bridge Pattern)详解

    java 桥模式(Bridge Pattern)详解

    这篇文章主要介绍了java 桥模式(Bridge Pattern)详解的相关资料,需要的朋友可以参考下...

    java教程网5122020-06-20
  • Java教程Java中ArrayList初始化的四种方法详解

    Java中ArrayList初始化的四种方法详解

    这篇文章主要介绍了Java中ArrayList初始化的四种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    稀土掘金12202021-09-03
  • Java教程SpringBoot整合SpringDataJPA

    SpringBoot整合SpringDataJPA

    这篇文章主要介绍了SpringBoot整合SpringDataJPA代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    大仙~猛5362021-10-13
  • Java教程Java实现实时监控目录下文件变化的方法

    Java实现实时监控目录下文件变化的方法

    今天小编就为大家分享一篇关于Java实现实时监控目录下文件变化的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    梦幻逝水3392019-06-21
  • Java教程Java Cache详解及简单实现

    Java Cache详解及简单实现

    这篇文章主要介绍了 Java Cache详解及简单实现的相关资料,需要的朋友可以参考下 ...

    EthanPark4462020-08-03
  • Java教程java 转发和重定向区别及实例代码

    java 转发和重定向区别及实例代码

    这篇文章主要介绍了java 转发和重定向区别及实例代码的相关资料,需要的朋友可以参考下...

    服务器之家3932020-07-06