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
相关产品推荐
相关产品推荐

