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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:06:03