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 参数校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Spring的Maven项目实现发送邮件功能的示例

    基于Spring的Maven项目实现发送邮件功能的示例

    这篇文章主要介绍了基于Spring的Maven项目实现发送邮件功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 盘点几种常见的java排序算法

    盘点几种常见的java排序算法

    所谓排序就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,下面这篇文章主要给大家介绍了几种常见的java排序算法的相关资料,需要的朋友可以参考下
    2021-11-11
  • Spring的自定义扩展标签NamespaceHandler解析

    Spring的自定义扩展标签NamespaceHandler解析

    这篇文章主要介绍了Spring的自定义扩展标签NamespaceHandler解析,在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直接基于Spring的标准Bean来配置,Spring提供了可扩展Schema的支持,这是一个不错的折中方案,需要的朋友可以参考下
    2023-12-12
  • Spring Boot集成Druid出现异常报错的原因及解决

    Spring Boot集成Druid出现异常报错的原因及解决

    Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。本文讲述了Spring Boot集成Druid项目中discard long time none received connection异常的解决方法,出现此问题的同学可以参考下
    2021-05-05
  • SpringBoot读取yaml文件操作详解

    SpringBoot读取yaml文件操作详解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Spring Boot 与 Vue.js 整合流程

    Spring Boot 与 Vue.js 整合流程

    本文重点介绍我在Spring Boot 与 Vue.js 整合实践过程中的基本流程,以及遇到的问题,感兴趣的朋友跟随小编一起看看吧
    2018-09-09
  • nacos如何修改默认的用户名密码

    nacos如何修改默认的用户名密码

    这篇文章主要介绍了nacos如何修改默认的用户名密码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringController返回值和异常自动包装的问题小结

    SpringController返回值和异常自动包装的问题小结

    今天遇到一个需求,在不改动原系统代码的情况下,将Controller的返回值和异常包装到一个统一的返回对象中去,下面通过本文给大家介绍SpringController返回值和异常自动包装的问题,需要的朋友可以参考下
    2024-03-03
  • Java使用NioSocket手动实现HTTP服务器

    Java使用NioSocket手动实现HTTP服务器

    本篇文章主要介绍了Java使用NioSocket手动实现HTTP服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-05-05
  • mybatisplus添加真正的批量新增、批量更新的实现

    mybatisplus添加真正的批量新增、批量更新的实现

    这篇文章主要介绍了mybatisplus添加真正的批量新增、批量更新的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论