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

Spring接口接收非法请求时未抛出MethodArgumentNotValidException且返回HTML而非JSON

解决Spring Boot校验失败返回HTML及无异常详情问题

问题原因分析

  1. 返回HTML而非JSON:Spring Boot默认错误处理会根据请求的Accept头或请求来源判断响应格式。如果Postman请求未明确指定Accept: application/json,框架可能将其识别为浏览器请求,返回默认的错误HTML页面。
  2. 无MethodArgumentNotValidException详情:默认情况下Spring不会主动将该异常的校验详情打印到控制台,也未提供结构化JSON响应,导致无法直接获知具体失败字段。

解决方案

1. 修正Postman请求头

在Postman请求头中添加以下配置:

  • Content-Type: application/json:确保请求体格式符合接口要求
  • Accept: application/json:明确告知后端需要JSON格式的响应

2. 自定义全局异常处理器

创建全局异常处理类,专门捕获MethodArgumentNotValidException,既打印校验详情到控制台,又返回结构化的JSON错误信息:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalValidationExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalValidationExceptionHandler.class);

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, Object>> handleValidationErrors(MethodArgumentNotValidException ex) {
        // 打印完整异常栈及校验详情到控制台
        logger.error("参数校验失败,详情如下", ex);

        BindingResult bindingResult = ex.getBindingResult();
        Map<String, String> fieldErrorMap = new HashMap<>();
        // 收集每个字段的错误信息
        for (FieldError error : bindingResult.getFieldErrors()) {
            fieldErrorMap.put(error.getField(), error.getDefaultMessage());
        }

        Map<String, Object> response = new HashMap<>();
        response.put("code", HttpStatus.BAD_REQUEST.value());
        response.put("msg", "请求参数校验失败");
        response.put("details", fieldErrorMap);

        return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
    }
}

3. 排查配置冲突

检查项目中是否存在自定义的ErrorController或其他异常处理器,避免它们覆盖全局异常处理的逻辑。如果有,需调整优先级或合并处理逻辑。

4. 确认校验注解配置

确保ReserveItemsRequest中的校验注解正确生效,示例如下:

public class ReserveItemsRequest {
    @NotNull(message = "用户ID不能为空")
    private Long userId;

    @Min(value = 1, message = "商品数量不能小于1")
    private Integer quantity;

    // 其他字段及getter/setter方法
}

如果存在嵌套对象,需在嵌套字段上添加@Valid注解以触发深层校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:39:49