Spring Boot使用hibernate-validator校验请求时Postman响应不符合预期
问题核心原因
你当前只处理了ConstraintViolationException,但Spring MVC中对@RequestBody标注的参数做@Valid校验失败时,默认抛出的是MethodArgumentNotValidException,所以你的全局异常处理器没有捕获到对应异常,自然不会返回预期的自定义响应结构。
解决方案
步骤1:在全局异常处理类中新增MethodArgumentNotValidException的处理方法
修改CustomerExceptionHandler类,新增如下方法:
import org.springframework.web.bind.MethodArgumentNotValidException; // 原有代码不变 @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<Errors> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, WebRequest request) { List<String> details = ex.getBindingResult() .getFieldErrors() .stream() .map(fieldError -> fieldError.getDefaultMessage()) .collect(Collectors.toList()); Errors error = new Errors(HttpStatus.BAD_REQUEST.value(), "Request Validation Error", details); return ResponseEntity.badRequest().body(error); }
原有ConstraintViolationException处理方法可以保留,用于处理@RequestParam、@PathVariable等参数绑定场景的校验异常。
步骤2:替换Controller中的MediaType类型
你当前在@PostMapping中使用的是JAX-RS规范的javax.ws.rs.core.MediaType,Spring MVC注解默认适配的是Spring自带的org.springframework.http.MediaType,建议替换避免序列化异常:
把@PostMapping注解修改为:
@PostMapping(consumes = org.springframework.http.MediaType.APPLICATION_JSON_VALUE, produces = org.springframework.http.MediaType.APPLICATION_JSON_VALUE)
步骤3:确认全局异常类的扫描范围
确保CustomerExceptionHandler所在的包在Spring Boot启动类的组件扫描范围内,若不在可在启动类上补充@ComponentScan注解指定包含该类的包路径。
可选优化(Spring Boot 2.3+版本适用)
建议直接引入官方的校验starter替代单独的hibernate-validator依赖,避免版本不兼容问题,pom.xml依赖如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
修改完成后重启服务,再用Postman发送非法请求即可得到预期的400响应结构。
内容的提问来源于stack exchange,提问作者Ripu Karn
相关产品推荐
相关产品推荐

