Java中如何在Spring项目中统一异常返回格式

通过@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处理异常

创建一个全局异常处理器,捕获项目中抛出的异常,并转换为统一格式返回:

@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, "服务器内部错误,请联系管理员"); } }

自定义业务异常类

为了更灵活地控制业务异常,可以定义自己的异常类:

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,避免部分接口格式不一致。
对于REST API,推荐使用 @RestControllerAdvice 替代 @ControllerAdvice,自动加上@ResponseBody。
生产环境建议记录异常日志,便于排查问题。

基本上就这些,通过全局异常处理机制,能有效提升API的健壮性和用户体验。