spring mvc 通过 @controlleradvice + @exceptionhandler 实现全局异常统一处理,返回标准 result json 格式,涵盖 code/msg/data 字段,支持开发/生产环境差异化响应、404/405 拦截及自定义 bizexception。

Spring MVC 统一处理全局异常返回格式,核心是用 @ControllerAdvice 配合 @ExceptionHandler 拦截所有 Controller 层未捕获的异常,并统一转为标准 JSON 响应(如 Result<t></t>),避免暴露技术细节,也省去每个接口写 try-catch 的重复劳动。
定义统一响应体 Result
这是整个方案的基础。所有正常返回和异常返回都走同一结构,前端可统一解析:
- 包含
code(业务码或 HTTP 状态码映射)、msg(用户友好提示)、data(可选数据)三个字段 - 提供静态工厂方法,如
Result.success()、Result.fail(1002, "手机号格式错误") - 建议用 Lombok 的
@Data简化代码,避免手动写 getter/setter
编写 @RestControllerAdvice 全局异常处理器
新建一个类,标注 @RestControllerAdvice,它会自动作用于所有 @Controller 和 @RestController:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 对每类异常写一个
@ExceptionHandler方法,例如捕获BizException返回 400 级提示,捕获NullPointerException记录 ERROR 日志并返回 500 提示 - 参数校验异常(
MethodArgumentNotValidException)可提取具体字段错误信息,组装成更精准的提示 - 兜底方法捕获
Exception,返回通用提示“系统繁忙,请稍后再试”,生产环境不输出堆栈
让 404 / 405 也能进异常处理器
默认情况下,404 不是异常,DispatcherServlet 直接返回 Whitelabel 页面。要让它被统一处理,需两步配置:
- 在
application.yml中启用抛出异常:spring.mvc.throw-exception-if-no-handler-found: true - 隔离静态资源路径,防止
/error被静态资源处理器拦截,例如设置spring.web.resources.static-path-pattern: /static/** - 同理,405 需额外加
spring.mvc.throw-exception-if-no-handler-found-for-method: true - 之后就能在
@ExceptionHandler(NoHandlerFoundException.class)中返回Result.fail("404", "请求地址不存在")
区分开发与生产环境行为
调试时可能需要看到简单堆栈辅助定位,但生产环境必须禁止暴露类名、路径、SQL 等敏感信息:
- 通过 Spring Profile 控制:开发环境
@Profile("dev")下,在异常响应中附加精简堆栈(如只取第一行) - 生产环境一律返回预设提示,同时后台打 ERROR 日志并触发告警(如发钉钉/邮件)
- 自定义异常类(如
BizException)应自带code和msg,抛出时直接throw new BizException(1001, "用户名已存在")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










