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中的指令重排详解

    Java中的指令重排详解

    在 Java 中,指令重排是一种性能优化技术,它涉及到编译器和处理器对程序中指令的执行顺序进行调整,以提高执行效率,本文给大家详细介绍了Java中的指令重排,需要的朋友可以参考下
    2023-12-12
  • 基于java实现简单发红包功能

    基于java实现简单发红包功能

    这篇文章主要为大家详细介绍了基于java实现简单发红包功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 利用spring boot+WebSocket实现后台主动消息推送功能

    利用spring boot+WebSocket实现后台主动消息推送功能

    目前对于服务端向客户端推送数据,常用技术方案有轮询、websocket等,下面这篇文章主要给大家介绍了关于利用spring boot+WebSocket实现后台主动消息推送功能的相关资料,需要的朋友可以参考下
    2022-04-04
  • java.lang.ExceptionInInitializerError异常的解决方法

    java.lang.ExceptionInInitializerError异常的解决方法

    这篇文章主要为大家详细介绍了java.lang.ExceptionInInitializerError异常的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Spring 中使用Quartz实现任务调度

    Spring 中使用Quartz实现任务调度

    这篇文章主要介绍了Spring 中使用Quartz实现任务调度,Spring中使用Quartz 有两种方式,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • 在 Spring Boot 中实现异常处理最佳实践

    在 Spring Boot 中实现异常处理最佳实践

    本文介绍如何在Spring Boot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧
    2025-04-04
  • 教你如何用Java替换Word中带有${}的内容

    教你如何用Java替换Word中带有${}的内容

    这篇文章主要介绍了教你如何用Java替换Word中带有${}的内容,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • SpringBoot整合mybatis-generator-maven-plugin的方法

    SpringBoot整合mybatis-generator-maven-plugin的方法

    这篇文章主要介绍了SpringBoot整合mybatis-generator-maven-plugin,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • java转发和重定向的区别

    java转发和重定向的区别

    这篇文章主要介绍了java转发和重定向的区别,需要的朋友可以参考下
    2014-10-10
  • SpringBoot开发案例之配置Druid数据库连接池的示例

    SpringBoot开发案例之配置Druid数据库连接池的示例

    本篇文章主要介绍了SpringBoot开发案例之配置Druid数据库连接池的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论