Java Validated 分组校验的使用

目录
  • 1.新建SpringBoot项目
  • 2.新建组
  • 3.新建请求对象
  • 4.接口测试
  • 5.结论

前言:

开发中我们会遇到多个接口公用一个请求对象的情况,如果需求变更,势必会破坏已有代码的逻辑,不符合开闭原则,对参数校验修修补补,不如一开始就划分明确,所以在这里记录下分组校验注解@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 分组校验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java使用@Validated注解进行参数验证的方法

    目前项目中大部分代码进行参数验证都是写代码进行验证,为了提升方便性和代码的简洁性,所以整理了下使用注解进行参数验证.使用效果如下: // 要验证的实体类 @Data public class User implements Serializable { @NotBlank(message = "id不能为空!",groups = Update.class) protected String id = ""; @NotBlank(message = "商户i

  • Java @Validated遇到的大坑与处理

    目录 Java @Validated 遇到的大坑 Validated注解使用 如果为空时的报错如下 空检查 Booelan检查 长度检查 日期检查 数值检查 Java @Validated 遇到的大坑 我在一个Controller内,在两个方法内使用@Validated,这是两个POST方法会进入的方法,这两个方法的实体类的命名(下图红框内容)不能一样,一样的话就会导致第二个在页面显示不出来错误信息(第一个可以正常显示),下图中的1和3名字不能一样,2和4名字不能一样,当出现一样的情况的时候就会

  • Java中的Valid和Validated的比较内容

    如果要添加接口校验,需要 1,在接口方法中请求参数前面添加@Valid注解,不需要在接口的实现类上添加@Valid注解,也不需要@Validated注解: addAnimal(@Valid Animal a) 2,在请求对象类的每个要校验的字段上添加@Valid注解,也不需要在类上添加@Validated注解: public class Animal{ @Valid @NotEmpty private String name; } Validated是Spring对javax.validatio

  • Java中Validated、Valid 、Validator区别详解

    目录 1. 结论先出 JSR 380 Valid VS Validated 不同点? Validator 2. @Valid和​​​​​​​@Validated 注解 3. 例子 4.使用@Valid嵌套校验 5. 组合使用@Valid和@Validated 进行集合校验 6. 自定义校验 自定义约束注解 工作原理 结论 参考链接: 1. 结论先出 Valid VS Validated 相同点 都可以对方法和参数进行校验 @Valid和@Validated 两种注释都会导致应用标准Bean验证.

  • Java Validated 分组校验的使用

    目录 1.新建SpringBoot项目 2.新建组 3.新建请求对象 4.接口测试 5.结论 前言: 开发中我们会遇到多个接口公用一个请求对象的情况,如果需求变更,势必会破坏已有代码的逻辑,不符合开闭原则,对参数校验修修补补,不如一开始就划分明确,所以在这里记录下分组校验注解@Validated的使用. 测试过程: 1.新建SpringBoot项目 新建一个SpringBoot项目,新建module -> 引入依赖 -> 编写主启动类 -> 编写配置文件 -> 新建各种包 2.新建

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

    目录 Spring @Validated分组校验的使用 引入POM依赖 定义接收数据的Vo 统一异常处理类 测试类 页面效果测试 使用@Validated分组遇到的坑 解决办法 Spring @Validated分组校验的使用 通过本文你能学习到@Validated 的基本使用,以及如何再spring-boot 中进行数据异常的统一处理 Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),j

  • spring @Validated 注解开发中使用group分组校验的实现

    之前知道spring支持JSR校验,在自己定义的bean中加入@NotNull,@NotBlank,@Length等之类的校验用于处理前台传递过来的request请求,避免在写多余的代码去处理. 但是随着业务的复杂度增加,对于校验的制定也越来越有要求,这个时候就需要引入分组group的概念,在自定义注解@Validated中 定义了一个Class[]数组用来分组.这样我们就可以引入分组校验的概念,首先根据需要的分组新建自己的接口. 然后在需要校验的bean上加入分组: 最后根据需要,在Contr

  • SpringBoot @Validated注解实现参数分组校验的方法实例

    前言 在前后端分离开发的时候我们需要用到参数校验,前端需要进行参数校验,后端接口同样的也需要,以防传入不合法的数据. 1.首先还是先导包,导入pom文件. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.解释一下注解的作用 @N

  • Spring Boot参数校验及分组校验的使用教程

    目录 一  前言 1  什么是validator 二  注解介绍 1  validator内置注解 三  使用 1  单参数校验 2  对象参数校验 3  错误消息的捕获 总结 一  前言 做web开发有一点很烦人就是要对前端输入参数进行校验,基本上每个接口都要对参数进行校验,比如一些非空校验.格式校验等.如果参数比较少的话还是容易处理的一但参数比较多了的话代码中就会出现大量的if-else语句. 使用这种方式虽然简单直接,但是也有不好的地方,一是降低了开发效率,因为我们需要校验的参数会存在很多

  • java身份证合法性校验并提取身份证有效信息

    java身份证合法性校验并获取身份证号有效信息,供大家参考,具体内容如下 java身份证合法性校验 /**身份证前6位[ABCDEF]为行政区划数字代码(简称数字码)说明(参考<GB/T 2260-2007 中华人民共和国行政区划代码>): * 该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区). * 市(地区,自治州,盟).县(自治县.县级市.旗.自治旗.市辖区.林区.特区). 数字码码位结构从左至右的含义是: 第一层为AB两位代码表

  • Java TokenProcessor令牌校验工具类

    关于TokenProcessor令牌校验工具类废话不多说了,直接给大家贴代码了,一切内容就在下面一段代码中,具体代码详情如下所示: public class TokenProcessor { private long privious;// 上次生成表单标识号得时间值 private static TokenProcessor instance = new TokenProcessor(); public static String FORM_TOKEN_KEY = "FORM_TOKEN_KE

  • Java实现的校验银行卡功能示例

    本文实例讲述了Java实现的校验银行卡功能.分享给大家供大家参考,具体如下: 步骤: 首先区分借记卡和信用卡,然后就是校验卡号,最后根据银联Bin确定什么银行,Bin之后就是归属地. 本文所有数据来源于网络,不一定保证正确和完整,这里仅仅作为教学使用. Java代码: package org.luozhuang.bankcard; public class checkBankCard { /* 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心, 因为并不是一个随便的信

  • java身份证合法性校验工具类实例代码

    1.身份证规则 计算方法(来源百度) 将前面的身份证号码17位数分别乘以不同的系数.从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2. 将这17位数字和系数相乘的结果相加. 用加出来和除以11,看余数是多少? 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字.其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2.(即余数0对应1,余数1对应0,余数2对应X-) 通过上面得知如果余数是3,就会在身份

随机推荐