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

SpringBoot从2.7.X迁移至3.3.1后@Validated不校验路径变量@Size

Spring Boot 3.3.1 方法级验证失效解决方案

问题根源

Spring Boot 3.x 基于 Spring Framework 6.x,后者对方法级验证的默认配置做了调整:不再自动启用方法验证切面,仅靠控制器类上的@Validated注解无法触发参数校验逻辑。此外,Spring Boot 3.x 全面切换到 Jakarta EE API,原javax.validation包下的注解已被弃用,必须使用jakarta.validation替代。

修复步骤

1. 显式启用方法验证切面

在你的应用启动类(或任意配置类)上添加@EnableMethodValidation注解,该注解会激活MethodValidationPostProcessor,负责处理方法级的校验规则:

@SpringBootApplication
@EnableMethodValidation
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

2. 替换校验注解的包路径

确保路径变量上的@Size注解来自jakarta.validation.constraints包,而非旧的javax.validation.constraints:

import jakarta.validation.constraints.Size;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Validated
public class ResourceController {
    @GetMapping("/resources/{id}")
    public String getResource(@PathVariable @Size(min = 64, max = 64) String id) {
        // 业务逻辑代码
        return "resource details";
    }
}

3. (可选)自定义校验异常响应

如果需要统一处理校验失败的异常,可以添加全局异常处理器,捕获ConstraintViolationException并返回友好响应:

import jakarta.validation.ConstraintViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ValidationErrorHandler {
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String handleValidationErrors(ConstraintViolationException ex) {
        return ex.getConstraintViolations().stream()
                .map(violation -> violation.getMessage())
                .findFirst()
                .orElse("请求参数格式错误");
    }
}

验证效果

完成上述配置后,当请求的路径变量长度不符合@Size规则时,会直接抛出ConstraintViolationException,并返回对应的错误信息,不会进入服务层执行业务逻辑。

内容的提问来源于stack exchange,提问作者Mohana Devarasetty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:27:03