@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 省略
}</t></t></t></t>
在 @RestControllerAdvice 中处理异常
用 @ExceptionHandler 捕获异常,并返回 ApiResponse 对象:
@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>> 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);
}
}</string></list></string>
只要方法返回对象(非 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>> handleIAE(IllegalArgumentException e) {
ApiResponse<string> res = ApiResponse.fail(400, e.getMessage());
return ResponseEntity.badRequest().body(res);
}</string></apiresponse>
不复杂但容易忽略:只要返回的是 POJO,Spring Boot 就会自动 JSON 化;重点在于结构设计、状态码设置和异常覆盖范围是否合理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











