应定义统一响应结构并配合全局异常处理与自动包装机制。使用泛型Result类(含code、message、data),状态码用枚举管理;通过@RestControllerAdvice分类捕获异常并返回对应Result;借助ResponseBodyAdvice自动将成功响应包装为Result.success(),确保所有接口响应格式一致。

定义清晰的统一响应结构
所有接口返回必须遵循固定格式,避免前端反复适配不同结构。推荐使用泛型 Result 类,包含三个核心字段:code(状态码)、message(提示信息)、data(业务数据)。状态码建议用枚举管理,比如 SUCCESS(200)、PARAM_ERROR(400)、NOT_FOUND(404)、INTERNAL_ERROR(500),既语义明确又便于全局替换。
用 @RestControllerAdvice 拦截所有异常
创建一个被 @RestControllerAdvice 注解的类,它会自动作用于所有 @RestController 方法。在这个类里,用多个 @ExceptionHandler 方法分别捕获不同异常:
- 捕获自定义业务异常(如 BizException),按其携带的 code 和 message 返回 Result.fail(code, msg)
- 捕获参数校验异常(MethodArgumentNotValidException),提取 BindingResult 中的错误字段,组装成“参数 xxx 不合法”类提示
- 捕获系统级异常(Exception 或 RuntimeException),统一返回 INTERNAL_ERROR(500),并记录完整堆栈日志
- 可选:单独处理 HttpRequestMethodNotSupportedException、HttpMediaTypeNotAcceptableException 等 HTTP 协议层异常,提升 API 健壮性
区分异常类型,做分级响应
不建议所有异常都返回 500。应根据错误性质分类处理:
- 客户端错误(4xx):如参数缺失、格式错误、权限不足,返回对应 code(400/401/403/404),message 明确友好,不暴露内部细节
- 服务端错误(5xx):如数据库连接失败、远程调用超时,返回 500 并记录详细日志,但 message 只显示“系统繁忙,请稍后重试”
- 业务规则错误:如“余额不足”“订单已取消”,用自定义异常抛出,code 为业务码(如 20001),message 面向用户,前端可直接展示
配合 ResponseBodyAdvice 自动包装成功响应
避免每个 Controller 方法手动套 Result.success()。实现 ResponseBodyAdvice,在响应写入前自动判断:若返回值不是 Result 类型,则包装成 Result.success(原返回值)。这样接口可以干净地写 @GetMapping("/user") public User getUser(),框架自动转为 {"code":200,"message":"success","data":{...}},异常路径和成功路径响应结构完全对齐。











