使用 @restcontrolleradvice 配合 @exceptionhandler(jsonparseexception.class) 即可捕获反序列化异常。spring boot 默认使用 jackson 进行 json 解析,当请求体格式错误或类型不匹配时,会抛出 jsonprocessingexception 及其子类。在处理器中直接拦截这些异常并返回统一的错误响应对象,就能实现全局控制。

@RequestBody 接收参数时反序列化失败怎么处理
当 Controller 方法使用 @RequestBody 接收 JSON 数据时,如果 JSON 结构不符合 Java 对象的定义,Jackson 会在进入方法体之前抛出 HttpMessageNotReadableException。这个异常内部包裹了具体的 JsonProcessingException。我们需要在全局异常处理器中捕获它,提取内部的错误信息,并将其封装为前端友好的 JSON 格式返回。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.converter.HttpMessageNotReadableException;
import com.fasterxml.jackson.core.JsonProcessingException;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<ErrorResponse> handleBadRequest(HttpMessageNotReadableException ex) {
String message = "Invalid request body";
if (ex.getCause() instanceof JsonProcessingException) {
JsonProcessingException jpe = (JsonProcessingException) ex.getCause();
message = jpe.getOriginalMessage();
}
ErrorResponse error = new ErrorResponse(400, message);
return ResponseEntity.badRequest().body(error);
}
}
自定义 ObjectMapper 导致反序列化异常如何统一处理
如果在项目中配置了自定义的 ObjectMapper 或引入了额外的 Jackson 模块,可能会触发更底层的反序列化错误,例如 MismatchedInputException 或 InvalidFormatException。这些异常同样继承自 JsonProcessingException。通过捕获父类 JsonProcessingException,可以覆盖所有由 Jackson 引起的反序列化问题,无需为每种具体异常编写单独的处理器。

import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
@ExceptionHandler(JsonProcessingException.class)
public ResponseEntity<ErrorResponse> handleJsonProcessing(JsonProcessingException ex) {
String type = ex.getClass().getSimpleName();
String message = ex.getMessage();
// 针对特定类型做额外处理
if (ex instanceof InvalidFormatException) {
message = "Type mismatch: " + ((InvalidFormatException) ex).getValue();
}
ErrorResponse error = new ErrorResponse(422, message);
return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body(error);
}
反序列化异常中 path 字段为空怎么定位具体字段
默认的 JsonProcessingException 有时不包含完整的路径信息,导致无法知道是哪个字段出错。可以通过配置 DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES 或使用 PropertyNamingStrategy 来辅助定位。但在异常处理层面,更可靠的方法是检查异常的 getProcessor() 和 getCurrentLocation() 方法,或者在 ErrorResponse 中手动构建包含字段名的错误详情。对于基本类型,Jackson 默认不会抛出异常而是使用默认值,除非显式开启了严格模式。


















