Spring Boot控制器验证失败时如何返回400状态码?
解决Spring Boot路径参数验证失败返回400状态码的方案
原因分析
当前代码里用@Size校验路径变量,但Spring Boot默认不会拦截路径变量的验证异常(ConstraintViolationException),会把它当作服务器内部错误抛出,所以返回500状态码。
具体配置步骤
1. 确认依赖(可选)
Spring Boot Starter Web默认包含Spring Validation依赖,如果是单独维护依赖的项目,确保引入:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2. 自定义全局异常处理器
创建全局异常处理类,捕获ConstraintViolationException并返回400状态码:
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.stream.Collectors; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity<String> handleConstraintViolation(ConstraintViolationException ex) { String errorMsg = ex.getConstraintViolations().stream() .map(ConstraintViolation::getMessage) .collect(Collectors.joining("; ")); return new ResponseEntity<>(errorMsg, HttpStatus.BAD_REQUEST); } }
3. 调整控制器代码
必须在控制器类上添加@Validated注解,开启方法参数的校验支持,同时可以优化注解的使用:
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; import javax.validation.constraints.Size; @RestController @Validated public class TestController { @GetMapping("/test/{p}") public String test(@PathVariable("p") @Size(min = 2, message = "参数长度不能小于2") String t) { return ""; } }
注:原代码中的
@Valid对路径变量校验无作用,@NonNull也可省略(路径变量required=true已保证非空)。
验证效果
- 传入长度≥2的字符串时,接口返回200状态码;
- 传入长度<2的字符串时,接口返回400状态码,并携带自定义错误提示。
内容的提问来源于stack exchange,提问作者Rafael Lima
相关产品推荐
相关产品推荐

