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

如何解决handleMethodArgumentNotValid对Postman请求参数不生效问题

问题解决:全局异常处理器适配非@RequestBody参数校验

你的全局异常处理器只处理了@RequestBody参数校验失败抛出的MethodArgumentNotValidException,但当校验非请求体参数(比如URL参数、表单参数)时,Spring会抛出ConstraintViolationException,原处理器无法捕获该异常,导致失效。

要让处理器同时支持两种场景,只需在GlobalExceptionHandler中新增针对ConstraintViolationException的处理方法,统一返回格式即可:

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    // 处理@RequestBody参数校验失败
    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                                 HttpHeaders headers,
                                                                 HttpStatus status,
                                                                 WebRequest request) {
        Map<String, List<String>> map = new HashMap<>();
        List<String> errors = ex.getBindingResult()
                .getFieldErrors()
                .stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.toList());
        map.put("message", errors);
        return new ResponseEntity<>(map, HttpStatus.BAD_REQUEST);
    }

    // 处理非@RequestBody参数校验失败(如URL参数、表单参数)
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex, WebRequest request) {
        Map<String, List<String>> map = new HashMap<>();
        List<String> errors = ex.getConstraintViolations()
                .stream()
                .map(ConstraintViolation::getMessage)
                .collect(Collectors.toList());
        map.put("message", errors);
        return new ResponseEntity<>(map, HttpStatus.BAD_REQUEST);
    }
}

说明:

  • handleConstraintViolation方法通过@ExceptionHandler(ConstraintViolationException.class)指定捕获该异常
  • 从ConstraintViolationException中提取默认校验提示消息,和原有返回格式保持一致,满足"仅返回默认提示消息"的需求

内容的提问来源于stack exchange,提问作者Ko Ye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:05:20