可以通过@controlleradvice配合@exceptionhandler实现全局异常处理,定义被该注解标记的类自动作用于所有控制器,支持按包路径、异常类型等筛选,并通过@exceptionhandler方法统一返回json格式响应体,结合自定义异常类与@responsestatus可简化状态码配置。

可以通过 @ControllerAdvice 配合 @ExceptionHandler 统一处理控制器中抛出的异常,实现全局、可复用、响应格式统一的异常拦截。
定义全局异常处理器类
创建一个被 @ControllerAdvice 注解的类,它会自动作用于所有 @Controller(或 @RestController)类。该类本身不需要继承任何父类,也不需要实现特定接口。
- 加上
@ControllerAdvice即可生效,推荐同时加@ResponseBody(或直接用@RestControllerAdvice),确保返回 JSON 而非视图 - 可以指定包路径限制生效范围,例如:
@ControllerAdvice(basePackages = "com.example.web") - 支持按异常类型、控制器类、方法等条件筛选,通过
@ControllerAdvice的属性控制
用 @ExceptionHandler 拦截具体异常
在全局处理器中,为每种需要捕获的异常类型编写对应的方法,并用 @ExceptionHandler 注解标记。Spring 会按继承关系匹配最具体的异常类型。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 方法参数可接收异常对象、
HttpServletRequest、HttpServletResponse、Model等,常用的是Exception ex - 返回值通常是封装后的响应体(如
ResponseEntity<result></result>或普通对象),由消息转换器序列化为 JSON - 示例:拦截
IllegalArgumentException并返回 400 错误码和提示信息
统一响应结构与状态码
避免直接返回原始异常堆栈,应构造业务友好的响应体(如包含 code、msg、data 字段的 Result 类),并设置合适的 HTTP 状态码。
- 使用
ResponseEntity可显式控制状态码,例如:return ResponseEntity.badRequest().body(result) - 对已知业务异常(如参数校验失败、权限不足),建议定义自定义异常类(如
BusinessException),再统一捕获处理 - 兜底处理
Exception时需谨慎记录日志,避免暴露敏感信息给前端
配合 @ResponseStatus 或 @ExceptionHandler 的 value 属性
除了方法级的 @ExceptionHandler,还可结合 @ResponseStatus 声明异常类本身的默认状态码,简化处理逻辑。
- 给自定义异常类添加
@ResponseStatus(HttpStatus.BAD_REQUEST),则只要该异常未被显式捕获,Spring 就会返回对应状态码 - 若已在
@ExceptionHandler中手动设置了状态码,则@ResponseStatus不生效 -
@ExceptionHandler的value属性支持数组,可一次声明多个异常类型,减少重复方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










