Springboot参数校验之分组校验、嵌套校验的实现

 更新时间:2023年08月22日 09:48:40   作者:临时工  
日常开发中,免不了需要对请求参数进行校验,诸如判空,长度,正则,集合等,复杂一点的请求参数可能会包含嵌套,分组校验,本文就详细的介绍一下,感兴趣的可以了解一下

日常开发中,免不了需要对请求参数进行校验,诸如判空,长度,正则,集合等,复杂一点的请求参数可能会包含嵌套,分组校验。

我们由简入深开始,一文搞定参数校验!

1. 简单判空

  • GET请求,字符串类型参数:使用@NotBlank注解 @NotBlank String mobile
  • GET请求,int,long byte等类型参数:使用@NotNull注解 @NotNull Integer userNum
  • POST请求,以body中参数为json为例:使用@Valid注解 @Valid UserReq userReq,UserReq中字段使用@NotBlank 或@NotNull

以下均为POST请求,以body中参数类型为json举例

2. 参数长度校验

@Size(min=5,max = 20)
    private String nickName;

长度5-20之间

3. 正则校验

 @Pattern(regexp = "^\\d{15}|\\d{18}$")
    private String idCard;

15或18位数字

4. 集合校验

 @NotEmpty
    private List<User> users;

集合不能为空

5.分组校验

分组校验需要先定义好分组,比如

举例,定义一个AddView类

public interface AddView {
}

针对上面的users集合使用分组

public class UserReq {
    private static final long serialVersionUID = 1L;
    /**
     * id
     */
    @NotNull
    private Long id;
    /**
     * 用户集合
     */
    @NotEmpty(groups = {AddView.class, UpdateView.class})
    private List<User> users;
}

通过配置groups使users在新增和修改的时候才会校验。
在请求方法上设置 @Validated,在修改users时,校验参数不能为空集合

 @PostMapping("users")
    public Response<Void> users(@RequestBody @Validated({UpdateView.class}) UserReq userReq) {
        // to do something
        return RespUtil.success();
    }

6. 嵌套校验

同样的我们用users举例;如果我们想要对users中某个字段也进行校验,那么怎么实现呢?
也很简单,只需要再加一个@Valid

public class UserReq {
    private static final long serialVersionUID = 1L;
    /**
     * id
     */
    @NotNull
    private Long id;
    /**
     * 用户集合
     */
    @NotEmpty(groups = {AddView.class, UpdateView.class})
    @Valid
    private List<User> users;
}

User内字段设置

public class User {
    private static final long serialVersionUID = 1L;
    /**
     * id
     */
    @NotNull
    private Long userId;
    /**
     * 姓名
     */
    @NotBlank
    private String name;
}

这样就实现了参数的嵌套校验+分组校验的组合。

当然,在包javax.validation.constraints下还有很多其他注解来选择支持不同场景的需要,比如@DecimalMax @DecimalMin @Email @Max @Min Negative等,这里仅列举常用的几个起到抛砖引玉的作用。

7. 请求header参数校验

有时候我们不单单需要校验body中参数,还有可能需要校验header中参数,比如常见的token啊、timestamp啊等等。

那就可以利用spring提供的@RequestHeader来实现,用法也很简单

@PostMapping("login")
    public Response<Void> login(@RequestBody @Valid LoginReq loginReq,
                                @NotBlank @RequestHeader("token") String token) {
        // to do something
        return RespUtil.success();

这里我们就实现了对header参数token的判空处理。
后记:参数校验场景各种各样,对于这些简单的使用,掌握好了还是能够覆盖大部分需求的;常用的必须掌握,不常用的我们需要知道,万一哪天遇到了,我们就知道在哪里去查现成的轮子可以使用;当然,对于复杂的参数校验,有可能需要您自定义注解实现,或者通过过滤器等方式实现。不必拘泥于固定形式。一切以结果为导向。

到此这篇关于Springboot参数校验之分组校验、嵌套校验的实现的文章就介绍到这了,更多相关Springboot 参数校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java客户端线上Apollo服务端的实现

    java客户端线上Apollo服务端的实现

    这篇文章主要介绍了java客户端线上Apollo服务端的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Java中的RMI使用方法详解

    Java中的RMI使用方法详解

    这篇文章主要介绍了Java中的RMI使用方法,RMI是Java提供的一个完善的简单易用的远程方法调用框架,采用客户服务器通信方式,在服务器上部署了提供各种服务的远程对象,下面我们来详细讲解
    2023-10-10
  • Netty分布式编码器及写数据事件处理使用场景

    Netty分布式编码器及写数据事件处理使用场景

    这篇文章主要为大家介绍了Netty分布式编码器及写数据事件处理使用场景剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,
    2022-03-03
  • Java线程协作的两种方式小结

    Java线程协作的两种方式小结

    Java中线程协作的最常见的两种方式是利用Object.wait()、Object.notify()和使用Condition,本文主要介绍了Java线程协作的两种方式小结,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • IDEA创建Maven项目后报错不出现src文件夹的情况解决

    IDEA创建Maven项目后报错不出现src文件夹的情况解决

    最近刚开始学习maven,正准备使用idea创建一个maven项目练手,却发现自己创建的maven项目始终没有src目录,下面这篇文章主要给大家介绍了关于IDEA创建Maven项目后报错不出现src文件夹的情况解决,需要的朋友可以参考下
    2023-05-05
  • spring data简化jpa开发_动力节点Java学院整理

    spring data简化jpa开发_动力节点Java学院整理

    这篇文章主要介绍了spring data简化jpa开发,本文主要讲述 Spring Data JPA,希望能够深入学习 Spring 和 JPA,有兴趣的可以了解下
    2017-09-09
  • JFrame中添加和设置JPanel的方法实例解析

    JFrame中添加和设置JPanel的方法实例解析

    这篇文章主要介绍了JFrame中添加和设置JPanel的方法实例解析,具有一定借鉴价值
    2018-01-01
  • 论Java Web应用中调优线程池的重要性

    论Java Web应用中调优线程池的重要性

    这篇文章主要论述Java Web应用中调优线程池的重要性,通过了解应用的需求,组合最大线程数和平均响应时间,得出一个合适的线程池配置
    2016-04-04
  • org.slf4j.Logger中info()方法的使用详解

    org.slf4j.Logger中info()方法的使用详解

    这篇文章主要介绍了org.slf4j.Logger中info()方法的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 最好的Java 反编译工具的使用对比分析

    最好的Java 反编译工具的使用对比分析

    恰好最近工作中也需要用到 Java 反编译,所以这篇文章介绍目前常见的的几种 Java 反编译工具的使用,在文章的最后也会通过编译速度、语法支持以及代码可读性三个维度,对它们进行测试,分析几款工具的优缺点,感兴趣的朋友一起看看吧
    2021-05-05

最新评论