Springboot参数校验之分组校验、嵌套校验的实现
作者:临时工
日常开发中,免不了需要对请求参数进行校验,诸如判空,长度,正则,集合等,复杂一点的请求参数可能会包含嵌套,分组校验。
我们由简入深开始,一文搞定参数校验!
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 参数校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!