使用 @restcontrolleradvice 配合 @exceptionhandler({jsonparseexception.class, jsonprocessingexception.class}) 即可捕获 json 解析异常。spring boot 在反序列化请求体时,若遇到格式错误会抛出这些异常,通过全局处理器统一拦截并返回标准错误响应。

如何配置全局异常处理器来捕获 JSON 解析异常
创建一个继承自 ControllerAdvice 的类,并在其中定义处理 JsonProcessingException 的方法。该方法接收异常对象和 HttpServletResponse,设置状态码为 400,并写入自定义的错误信息 JSON 字符串。

import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(JsonProcessingException.class)
public void handleJsonException(JsonProcessingException e, HttpServletResponse response) throws IOException {
response.setStatus(HttpStatus.BAD_REQUEST.value());
response.setContentType("application/json;charset=UTF-8");
String error = "{\"error\":\"Invalid JSON format\",\"message\":\"" + e.getOriginalMessage() + "\"}";
response.getWriter().write(error);
}
}
上述代码中,@RestControllerAdvice 注解使得该类自动成为全局异常处理器。@ExceptionHandler 指定了要处理的异常类型。当 Spring MVC 发现请求体的 JSON 格式不正确时,会自动调用此方法。注意,这里直接操作 HttpServletResponse 是为了确保响应内容不被其他消息转换器再次包装,从而保证客户端收到的是我们构造的 JSON 错误信息。
如何处理更具体的 JSON 解析错误场景
除了通用的 JsonProcessingException,还可以针对特定的子类如 MismatchedInputException 进行更细致的处理。例如,当期望接收一个对象但收到了数组时,可以返回不同的错误提示。

import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MismatchedInputException.class)
public void handleMismatchedInput(MismatchedInputException e, HttpServletResponse response) throws IOException {
response.setStatus(HttpStatus.BAD_REQUEST.value());
response.setContentType("application/json;charset=UTF-8");
String error = "{\"error\":\"Type mismatch\",\"message\":\"Expected object but got array\"}";
response.getWriter().write(error);
}
}
在这个例子中,MismatchedInputException 是 JsonProcessingException 的子类。如果同时存在两个 @ExceptionHandler 方法,Spring 会根据异常的具体类型选择最匹配的处理方法。通常建议先处理更具体的异常,再处理通用的异常,或者只处理通用异常以简化逻辑。在实际项目中,可以根据业务需求决定是否需要区分不同类型的 JSON 解析错误。
基于程序中某个输入、条件或结果的具体问题
当请求头中包含 Content-Type: application/json 且请求体为无效 JSON 字符串时,全局异常处理器将捕获 JsonProcessingException 并返回 400 状态码及自定义错误信息。这是最常见的 JSON 解析异常场景,适用于大多数 RESTful API 接口。


















