Java Validated 分组校验的使用

 更新时间:2022年02月14日 15:47:10   作者:干净又卫生  
这篇文章主要介绍了Java Validated 分组校验的使用,文章记录所以在这里记录下分组校验注解@Validated的使用,具有一定的参考价值,需要的朋友可以参考一下

前言:

开发中我们会遇到多个接口公用一个请求对象的情况,如果需求变更,势必会破坏已有代码的逻辑,不符合开闭原则,对参数校验修修补补,不如一开始就划分明确,所以在这里记录下分组校验注解@Validated的使用。

测试过程:

1.新建SpringBoot项目

新建一个SpringBoot项目,新建module -> 引入依赖 -> 编写主启动类 -> 编写配置文件 -> 新建各种包

2.新建组

Validated有自己默认的组 Default.class

我们要建的组,就是不同业务使用字段分成的组,举例的业务是一个用户对象,用户有不同的角色,不同的接口会用到这个用户对象的不同字段。比如学生(Student),老师(Teacher):

Student

public interface Student {
}

Teacher

public interface Teacher {
}

3.新建请求对象

我们的业务是多个接口共用一个请求对象,所以不同接口用到这个对象里的字段一定不同。所以在这里对不同的字段作了分组,比如:

  • 老师肯定会有手机号、手下也一定有几个学生,所以被划分到Teacher组;
  • 学生一定要有几本书,所以被划分到Student组;
  • 没有被分组的字段默认是Default组;
  • 给所有字段用校验注解添加校验,以便测试是否分组生效。

UserDTO

@Data
public class UserDTO {

    @NotBlank(message = "id必传")
    private String id;

    @NotBlank(message = "不能没有名称")
    private String name;

    @NotBlank(message = "老师不能没有手机号", groups = Teacher.class)
    private String phone;

    @NotNull(message = "age必传")
    private Integer age;

    @NotBlank(message = "不能没有idCard")
    private String idCard;

    @NotEmpty(message = "学生不能没有书")
    @Size(min = 2, message = "学生必须有两本书", groups = Student.class)
    private List<String> bookNames;

    @NotEmpty
    @Size(min = 1, message = "老师不能没有学生", groups = Teacher.class)
    private List<String> studentNames;
}

4.接口测试

对这个对象的不同业务划分出5个接口,测试下字段分组之后的必传情况: 这样看的清楚些

Controller

@RestController
public class ValidatedController {
    
    /**
     * 测试 分组校验 student
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("student")
    public UserDTO validatedStudent(@Validated(value = {Student.class, Default.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

    /**
     * 测试 分组校验  teacher
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("teacher")
    public UserDTO validatedTeacher(@Validated(value = {Teacher.class, Default.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

    /**
     * 测试 分组校验  default
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("default")
    public UserDTO validatedDefault(@Validated(value = {Default.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

    /**
     * 测试 分组校验 onlyStudent
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("onlyStudent")
    public UserDTO validatedOnlyStudent(@Validated(value = {Student.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

    /**
     * 测试 分组校验 onlyTeacher
     *
     * @date 2022/2/11 15:47:14
     */
    @PostMapping("onlyTeacher")
    public UserDTO validatedOnlyTeacher(@Validated(value = {Teacher.class}) @RequestBody UserDTO userDTO) {
        return userDTO;
    }

}

StudentTeacherDefaultOnlyStudentOnlyTeacher 进行测试

不需要列举所有情况,这里就用Student接口做测试。这个接口如果不传递Student组的bookNames字段或者bookNames字段长度不足 2 就会抛出异常,但是因为分组的缘故,即使不传递Teacher Group的字段也不会受到影响。

不传bookNames

只传递一个bookNames

5.结论

其它接口例子我就不多说了,因为没有显式分组的默认都是Default组,所以,测试接口里面有Default组的测试,就是默认没有分组的属性都归Default管理;
测试用例中的only这两个组,就是在没有Default的情况下,只对Student和Teacher 组的字段进行校验;
要注意平常我们写@Validated注解的时候,默认就是@Validated(group = {Default.class}),也就是默认所有字段都是Default组的,显式分组之后,剩下的那些没有被划分到自建组的字段都是Default组;
因为这种机制的出现所以我们可以很灵活的使用对象里面的某些字段,比如可以新建一个Master组,可以将Student和Teacher组的字段都划分到Master组,以实现类似于高权限等级的参数传递校验等等操作!

到此这篇关于Java Validated 分组校验的使用的文章就介绍到这了,更多相关Java Validated 分组校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JSON中fastjson、jackson、gson如何选择

    JSON中fastjson、jackson、gson如何选择

    在Java中,JSON的解析方式很多,例如fastjson(阿里)、Gson(谷歌)、jackjson等,本文主要介绍了JSON中fastjson、jackson、gson如何选择,具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • SpringBoot+MyBatis+AOP实现读写分离的示例代码

    SpringBoot+MyBatis+AOP实现读写分离的示例代码

    高并发这个阶段,肯定是需要做MySQL读写分离的。本文主要介绍了SpringBoot+MyBatis+AOP实现读写分离的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Spring整合Mybatis详细步骤

    Spring整合Mybatis详细步骤

    今天带大家来学习Spring怎么整合Mybatis,文中有非常详细的代码示例及介绍,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Java实现纪元秒和本地日期时间互换的方法【经典实例】

    Java实现纪元秒和本地日期时间互换的方法【经典实例】

    这篇文章主要介绍了Java实现纪元秒和本地日期时间互换的方法,结合具体实例形式分析了Java日期时间相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • Java Struts图片上传至指定文件夹并显示图片功能

    Java Struts图片上传至指定文件夹并显示图片功能

    这篇文章主要介绍了Java Struts图片上传至指定文件夹并显示图片功能,需要的朋友可以参考下
    2017-08-08
  • Java获取代码中方法参数名信息的方法

    Java获取代码中方法参数名信息的方法

    在java中,可以通过反射获取到类、字段、方法签名等相关的信息,像方法名、返回值类型、参数类型、泛型类型参数等,但是不能够获取方法的参数名。在实际开发场景中,有时需要根据方法的参数名做一些操作,那么该如何操作了呢?下面就通过这篇文章来学习学习吧。
    2016-09-09
  • Java方法签名的获取实例代码

    Java方法签名的获取实例代码

    这篇文章主要介绍了Java方法签名的获取实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • xml 的特殊字符的处理方法

    xml 的特殊字符的处理方法

    在xml中,有一些符号作为XML 的标记符号,一些特定情况下,属性值必须带有这些特殊符号。 下面主要是讲解一些常用的特殊符号的处理
    2016-07-07
  • Java通过数据库表生成实体类详细过程

    Java通过数据库表生成实体类详细过程

    这篇文章主要介绍了Java通过数据库表生成实体类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • Maven环境安装配置和新建项目介绍

    Maven环境安装配置和新建项目介绍

    这篇文章介绍了Maven环境安装配置和新建项目介绍,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12

最新评论