在日常开发中,比如我们有一套账户的model,关于账户有增删改查的4个接口,此时我们对于这4个接口里面都会接收账户相关的model,只是对应的参数不一样而已,那么我们是希望重用1个model还是写4个model呢?答案肯定是重用1个model即可。但是如果重用一个model的话,那么不同的接口需要对不同的参数进行校验,此时怎么办呢?答案就是分组校验。
例如我们有一个账户的model,里面的字段有:
1、username 2、password
此时在注册的时候我们只需要对username进行校验不需要对password进行校验,然后在登录的时候需要对username和password同时进行校验。基于这样的场景,我们来编写一个分组校验的案例。
1)创建分组
对于分组来说,常用的分组无外乎主要是增删改查,所以我们直接创建4个增删改查的分组即可,示例图如下:
这些分组都是一些空的接口类,主要是用来标注分组信息而已,示例图如下:
2)参数校验定义分组
接下来我们需要做的就是在model里面对不同的字段定义分组,区分哪些注解在哪些分组里面生效,示例代码如下:
package com.mybatis.demo.model; import java.io.Serializable; import javax.validation.constraints.NotNull; import com.mybatis.demo.valid.action.AddAction; import com.mybatis.demo.valid.action.DeleteAction; import com.mybatis.demo.valid.action.SelectAction; import com.mybatis.demo.valid.action.UpdateAction; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.Builder; @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @ToString @Builder public class LoginReuqest implements Serializable { /** * */ private static final long serialVersionUID = 4824273035410072985L; @NotNull(message = "用户名不能为空", groups = { AddAction.class, DeleteAction.class, SelectAction.class, UpdateAction.class }) private String username; @NotNull(message = "用户密码不能为空", groups = { SelectAction.class, UpdateAction.class }) private String password; }
这里我们在loginrequest里面吧username标注到新增,删除,修改,查询分组的时候使用,所以定义的group是:groups = { AddAction.class, DeleteAction.class, SelectAction.class, UpdateAction.class }
然后password定义查询和更新的时候才使用,所以定义的group是:groups = { SelectAction.class, UpdateAction.class })
3)接口校验分组
接下来我们就需要在接口的地方选择什么时候使用什么分组,例如我们在登录的时候就使用select分组,在注册的时候选择使用add分组,所以我们选择的分组如下:
@RequestMapping("/login") public BaseResponse login(@RequestBody @Validated(value = SelectAction.class) LoginReuqest user) { return BaseResponse.ok(); } @RequestMapping("/register") public BaseResponse add(@RequestBody @Validated(value = AddAction.class) LoginReuqest user) { return BaseResponse.ok(); }
这里选择什么分组,需要在@Validated注解里面标明使用什么分组。
3)运行测试
接下来我们把项目运行起来,首先测试登录接口:
可以看到login的时候对密码进行了非空校验,然后我们再测试下注册接口:
注册接口直接通过了,说明注册的时候没有判断密码。以上就是参数校验的分组校验,是不是很实用?
备注:
1、对于参数校验来说是重中之重。 2、利用分组校验可以很好的编写漂亮的代码,并且做代码审查的时候也非常直观。
最后按照惯例,附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...