Spring Boot中基于路由的同一Model条件校验实现方案咨询
基于Spring Validation分组校验实现接口差异化校验
不用额外创建多个请求模板,直接用Spring Validation的分组校验就能搞定,步骤很简单:
1. 定义校验分组标记接口
先创建两个空接口,用来标记不同的校验场景(不用写任何方法,只是做分组标识):
// 登录校验分组 public interface SignInGroup {} // 注册校验分组 public interface SignUpGroup {}
2. 给User实体的校验注解指定分组
修改User类里的校验规则,通过groups属性指定每个规则生效的场景:
public class User { // 登录、注册都需要校验用户名非空 @NotBlank(groups = {SignInGroup.class, SignUpGroup.class}) private String username; // 登录、注册都需要校验密码非空且长度合规 @NotBlank(groups = {SignInGroup.class, SignUpGroup.class}) @Size(min = 6, max = 20, groups = {SignInGroup.class, SignUpGroup.class}) private String password; // 仅注册时需要校验邮箱非空且格式合法 @NotBlank(groups = SignUpGroup.class) @Email(groups = SignUpGroup.class) private String email; // getter、setter 省略 }
3. 在Controller接口中指定校验分组
用@Validated替代原来的@Valid注解,并传入对应的分组类,Spring就会按照指定分组的规则校验请求体:
@RestController @RequestMapping("/api/auth") public class AuthController { @PostMapping("/signin") public ResponseEntity<?> signIn(@Validated(SignInGroup.class) @RequestBody User user) { // 登录业务逻辑 return ResponseEntity.ok("登录成功"); } @PostMapping("/signup") public ResponseEntity<?> signUp(@Validated(SignUpGroup.class) @RequestBody User user) { // 注册业务逻辑 return ResponseEntity.ok("注册成功"); } }
这样调用/api/auth/signin时,只会校验用户名和密码的规则;调用/api/auth/signup时,会同时校验用户名、密码和邮箱的规则,完全满足差异化校验的需求,还不用额外定义多个请求DTO。
内容的提问来源于stack exchange,提问作者vw0389
相关产品推荐
相关产品推荐

