@RestControllerAdvice 默认返回 JSON 异常响应,需引入 spring-boot-starter-web(内置 Jackson),推荐封装 ApiResponse 统一响应结构,用 @ExceptionHandler 返回该对象,并通过 ResponseEntity 精确控制状态码与响应体。

Spring Boot 中 @RestControllerAdvice 默认就能返回 JSON 格式异常响应,前提是项目已引入 Web 依赖(如 spring-boot-starter-web),且异常处理器方法返回值被自动序列化为 JSON。
确保项目具备 JSON 支持
Spring Boot 默认使用 Jackson 处理 JSON 序列化。检查 pom.xml 是否包含:
-
spring-boot-starter-web(已内置 Jackson) - 无需额外配置,但若手动排除了 Jackson,需补回
jackson-databind
定义统一异常响应结构
推荐封装一个标准响应体,便于前端解析:
public class ApiResponse<T> {
private int code;
private String message;
private T data;
public static <T> ApiResponse<T> fail(int code, String message) {
ApiResponse<T> res = new ApiResponse<>();
res.code = code;
res.message = message;
return res;
}
// getter/setter 省略
}
在 @RestControllerAdvice 中处理异常
用 @ExceptionHandler 捕获异常,并返回 ApiResponse 对象:
立即学习“Java免费学习笔记(深入)”;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NullPointerException.class)
public ApiResponse<String> handleNPE(NullPointerException e) {
return ApiResponse.fail(500, "空指针异常:" + e.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ApiResponse<List<String>> handleValidation(MethodArgumentNotValidException e) {
List<String> errors = e.getBindingResult().getFieldErrors()
.stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.collect(Collectors.toList());
return ApiResponse.fail(400, "参数校验失败").data(errors);
}
}
只要方法返回对象(非 void 或 String 原始类型),Spring 就会用 Jackson 自动转成 JSON 响应体。
注意 Content-Type 和状态码
默认响应头是 Content-Type: application/json,但 HTTP 状态码需显式设置:
- 用
@ResponseStatus(HttpStatus.BAD_REQUEST)注解方法,适用于固定状态码 - 或在方法中注入
HttpServletResponse,调用response.setStatus(400) - 更推荐使用
ResponseEntity精确控制状态码和响应体:
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<ApiResponse<String>> handleIAE(IllegalArgumentException e) {
ApiResponse<String> res = ApiResponse.fail(400, e.getMessage());
return ResponseEntity.badRequest().body(res);
}
不复杂但容易忽略:只要返回的是 POJO,Spring Boot 就会自动 JSON 化;重点在于结构设计、状态码设置和异常覆盖范围是否合理。


















