通过@ControllerAdvice和自定义异常类实现统一异常处理,先定义Result类封装返回格式,再创建GlobalExceptionHandler捕获BusinessException、NullPointerException等异常并转换为标准Result响应,结合@RestControllerAdvice确保接口返回格式一致,提升API健壮性。

在Spring项目中,为了保证接口返回的异常信息统一、清晰,通常需要对异常进行全局处理。通过 @ControllerAdvice 和 @ExceptionHandler 可以实现统一异常响应格式。
定义统一返回结果格式
先创建一个通用的响应体类,用于封装成功和异常时的返回数据:
public class Result {
private int code;
private String message;
private T data;
public static Result error(int code, String message) {
Result result = new Result();
result.code = code;
result.message = message;
return result;
}
public static Result success(T data) {
Result result = new Result();
result.code = 200;
result.message = "success";
result.data = data;
return result;
}
// getter 和 setter 省略
}
使用@ControllerAdvice处理异常
创建一个全局异常处理器,捕获项目中抛出的异常,并转换为统一格式返回:
JavaStoryDevelop
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
下载
@ControllerAdvice
public class GlobalExceptionHandler {
// 处理自定义业务异常
@ExceptionHandler(BusinessException.class)
@ResponseBody
public Result handleBusinessException(BusinessException e) {
return Result.error(e.getCode(), e.getMessage());
}
// 处理空指针异常
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public Result handleNpeException(NullPointerException e) {
return Result.error(500, "发生了空指针异常");
}
// 处理参数绑定异常
@ExceptionHandler(MissingServletRequestParameterException.class)
@ResponseBody
public Result handleParamMissing(MissingServletRequestParameterException e) {
return Result.error(400, "缺少必要参数: " + e.getParameterName());
}
// 处理所有未被捕获的异常
@ExceptionHandler(Exception.class)
@ResponseBody
public Result handleUnexpectedException(Exception e) {
return Result.error(500, "服务器内部错误,请联系管理员");
}
}
自定义业务异常类
为了更灵活地控制业务异常,可以定义自己的异常类:
立即学习“Java免费学习笔记(深入)”;
public class BusinessException extends RuntimeException {
private int code;
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
public int getCode() {
return code;
}
}
在业务代码中直接抛出:
if (user == null) {
throw new BusinessException(404, "用户不存在");
}
注意事项
确保控制器返回类型统一为 Result<T>,避免部分接口格式不一致。
对于REST API,推荐使用 @RestControllerAdvice 替代 @ControllerAdvice,自动加上@ResponseBody。
生产环境建议记录异常日志,便于排查问题。
基本上就这些,通过全局异常处理机制,能有效提升API的健壮性和用户体验。