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

 更新时间:2021年10月20日 09:32:58   作者:妖四灵.Shuen  
这篇文章主要介绍了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 {
}

定义接收数据的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

填入一个错误age

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

使用@Validated分组遇到的坑

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

解决办法

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

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

相关文章

  • JAVA多线程之方法 JOIN详解及实例代码

    JAVA多线程之方法 JOIN详解及实例代码

    这篇文章主要介绍了JAVA多线程之方法 JOIN详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • 详解Java的闭包

    详解Java的闭包

    这篇文章主要介绍了详解Java的闭包,作者从Lambda和默认方法等重要特性深入讲解,极力推荐!需要的朋友可以参考下
    2015-07-07
  • 深入了解SpringAOP中的jdk动态代理与CGlib

    深入了解SpringAOP中的jdk动态代理与CGlib

    这篇文章主要介绍了深入了解SpringAOP中的jdk动态代理与CGlib,一般我们编写程序的思想是纵向的,也就是一个方法代码从该方法第一行开始往下一步一步走,直到走完最后一行代码,也就是说很多业务都需要的比如用户鉴权,资源释放等,需要的朋友可以参考下
    2023-12-12
  • Springboot基于maven打包分离lib及resource

    Springboot基于maven打包分离lib及resource

    这篇文章主要介绍了Springboot基于maven打包分离lib及resource,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java 深入浅出解析面向对象之抽象类和接口

    Java 深入浅出解析面向对象之抽象类和接口

    本章具体介绍了抽象类和接口,整篇文章用目前流行的手机来举例,图解穿插代码案例。 JAVA成仙路从基础开始讲,后续会讲到JAVA高级,中间会穿插面试题和项目实战,希望能给大家带来帮助
    2022-03-03
  • java中的FileReader和FileWriter读写流

    java中的FileReader和FileWriter读写流

    这篇文章主要介绍了java中的FileReader和FileWriter读写流,在java中对数据输入输出的操作陈作为流我们对不同的文件进行操作,或者对操作文件进行输入和输出时所用的流都是不同的,因此在java.io的包下存在很多流的类或者接口提供给我们对应的操作,需要的朋友可以参考下
    2023-10-10
  • 使用@Service注解出现No bean named 'xxxx' available]错误的解决

    使用@Service注解出现No bean named 'xxxx'&

    这篇文章主要介绍了使用@Service注解出现No bean named 'xxxx' available]错误的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java基础之教你如何正确运用依赖注入

    Java基础之教你如何正确运用依赖注入

    最近发现很多使用Spring框架的Java代码存在依赖注入方式的误用,甚至是滥用.因此整理了这篇文章,欢迎大家一起探讨,需要的朋友可以参考下
    2021-05-05
  • Java定义画板类的方法

    Java定义画板类的方法

    这篇文章主要为大家详细介绍了Java定义画板类的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 详谈java中int和Integer的区别及自动装箱和自动拆箱

    详谈java中int和Integer的区别及自动装箱和自动拆箱

    这篇文章主要介绍了详谈java中int和Integer的区别及自动装箱和自动拆箱,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论