You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:00:54