当前位置: 首页 > news >正文

Spring Boot2错误处理

一、错误处理底层组件分析

Spring Boot 2 错误处理的核心组件包括:

  1. ErrorMvcAutoConfiguration
    自动配置类,初始化错误处理基础设施
  2. BasicErrorController
    处理/error请求的默认控制器,根据请求类型返回JSON或错误视图
  3. DefaultErrorAttributes
    收集错误信息(状态码、异常、时间戳等)
  4. ErrorPageCustomizer
    注册错误页面(如404重定向到/error
  5. DefaultErrorViewResolver
    解析错误视图模板(如error/404.html
二、异常处理流程分析
graph TD
A[请求进入DispatcherServlet] --> B[执行Controller]
B --> C{是否抛出异常?}
C -->|是| D[遍历HandlerExceptionResolver]
C -->|否| E[正常响应]
D --> F{找到匹配解析器?}
F -->|是| G[解析器处理异常]
F -->|否| H[异常传递到Servlet容器]
H --> I[ErrorPageCustomizer重定向到/error]
I --> J[BasicErrorController处理]
J --> K[返回错误响应]

三、全局异常处理(@ControllerAdvice)
@ControllerAdvice
public class GlobalExceptionHandler {// 处理特定异常@ExceptionHandler(CustomException.class)public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {ErrorResponse response = new ErrorResponse(ex.getCode(), ex.getMessage());return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);}// 处理所有未捕获异常@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {ErrorResponse response = new ErrorResponse("GLOBAL_001", "系统异常");return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);}
}

四、自定义异常实现
// 业务异常基类
public abstract class BusinessException extends RuntimeException {private final String errorCode;public BusinessException(String errorCode, String message) {super(message);this.errorCode = errorCode;}public String getErrorCode() {return errorCode;}
}// 具体业务异常
public class OrderNotFoundException extends BusinessException {public OrderNotFoundException(Long orderId) {super("ORDER_404", "订单不存在: " + orderId);}
}// 使用示例
@GetMapping("/orders/{id}")
public Order getOrder(@PathVariable Long id) {return orderRepository.findById(id).orElseThrow(() -> new OrderNotFoundException(id));
}

五、自定义异常处理解释器分析

通过实现HandlerExceptionResolver接口深度定制:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE) // 最高优先级
public class CustomExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) {// 1. 识别异常类型if (ex instanceof BusinessException) {BusinessException bex = (BusinessException) ex;// 2. 构建统一响应体ErrorResult result = new ErrorResult(bex.getErrorCode(),bex.getMessage(),Instant.now());// 3. 设置HTTP状态码response.setStatus(HttpStatus.BAD_REQUEST.value());// 4. 返回JSON响应try {response.getWriter().write(new ObjectMapper().writeValueAsString(result));return new ModelAndView(); // 返回空视图表示已处理} catch (IOException e) {return null; // 继续其他解析器处理}}return null; // 其他异常由后续解析器处理}
}

关键机制对比
处理方式适用场景执行优先级
@ExceptionHandler控制器内局部异常处理最高
@ControllerAdvice全局异常处理
HandlerExceptionResolver底层定制化处理
BasicErrorController默认错误端点最低

最佳实践建议

  1. 业务异常使用自定义异常体系
  2. 全局处理使用@ControllerAdvice覆盖常见异常
  3. 通过HandlerExceptionResolver处理特殊协议响应
  4. application.yml中配置:
    server:error:include-exception: true   # 响应中包含异常信息include-stacktrace: never # 生产环境关闭堆栈
    

http://www.dtcms.com/a/300433.html

相关文章:

  • 负载均衡 LoadBalance
  • Spring Boot音乐服务器项目-查询音乐模块
  • 《Foundation 面板:设计、功能与最佳实践解析》
  • Java学习-------序列化与反序列化
  • UV: 下一代 Python 包管理工具
  • golang--虚拟地址空间
  • 阿里 Qwen3 四模型齐发,字节 Coze 全面开源,GPT-5 8 月初发布!| AI Weekly 7.21-7.27
  • 批量重命名带编号工具,附免费地址
  • Android网络框架封装 ---> Retrofit + OkHttp + 协程 + LiveData + 断点续传 + 多线程下载 + 进度框交互
  • linux根据pid获取服务目录
  • 一场关于电商零售增长破局的深圳探索
  • Vulnhub red靶机渗透攻略详解
  • PHP框架之Laravel框架教程:2. 控制器、路由、视图简单介绍
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现标签条码一维码的检测(C#代码,UI界面版)
  • WPFC#超市管理系统(2)顾客管理、供应商管理、用户管理
  • MySQL ROUTER安装部署
  • EasyExcel使用(二:写出)
  • git 提交时排除一个或多个文件
  • mac系统彻底删除mysql并重装
  • 【LeetCode】LRU 缓存 题解
  • 在Podman/Docker容器中为Luckfox Lyra Zero W编译SDK:终极排错指南
  • C 语言第 10 天学习笔记:字符串基础操作与相关函数
  • 在docker中安装frp实现内网穿透
  • Libevent(4)之使用教程(3)配置
  • 比特币运行机制全解析:区块链、共识算法与数字黄金的未来挑战
  • 【micro:bit】从入门到放弃(八):超声波测距、小车巡线、红外避障
  • Redis对象机制详解
  • vue3.6更新哪些内容
  • 如何在 InsCodeAI 上搭建并使用 Jupyter Notebook 环境?
  • spring gateway 配置http和websocket路由转发规则