千家信息网

如何使用Spring中@Validated分组校验

发表于:2024-11-16 作者:千家信息网编辑
千家信息网最后更新 2024年11月16日,这篇文章主要介绍"如何使用Spring中@Validated分组校验",在日常操作中,相信很多人在如何使用Spring中@Validated分组校验问题上存在疑惑,小编查阅了各式资料,整理出简单好用的
千家信息网最后更新 2024年11月16日如何使用Spring中@Validated分组校验

这篇文章主要介绍"如何使用Spring中@Validated分组校验",在日常操作中,相信很多人在如何使用Spring中@Validated分组校验问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何使用Spring中@Validated分组校验"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • Spring @Validated分组校验的使用

    • 引入POM依赖

    • 定义接收数据的Vo

    • 统一异常处理类

    • 测试类

    • 页面效果测试

  • 使用@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依赖

            org.hibernate            hibernate-validator            5.2.4.Final        

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

public interface Add {}
public interface Edit {}

定义接收数据的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; /** * 全局异常处理 */@ControllerAdvicepublic 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

填入一个错误age

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

使用@Validated分组遇到的坑

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

解决办法

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

到此,关于"如何使用Spring中@Validated分组校验"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0