likes
comments
collection
share

Springboot参数校验之分组校验、嵌套校验

作者站长头像
站长
· 阅读数 12

分享技术,用心生活


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

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.分组校验

分组校验需要先定义好分组,比如 Springboot参数校验之分组校验、嵌套校验

举例,定义一个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的判空处理。

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