news 2026/9/3 1:25:22

Spring Boot统一异常处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot统一异常处理

在Spring Boot中实现统一异常处理主要通过@ControllerAdvice@ExceptionHandler注解组合完成。这种方式能集中处理控制器层抛出的异常,避免在每个方法中重复编写异常处理代码。

基础实现步骤

创建全局异常处理类并添加@ControllerAdvice注解。这个类可以包含多个异常处理方法:

@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse error = new ErrorResponse( HttpStatus.INTERNAL_SERVER_ERROR.value(), "Internal Server Error", ex.getMessage() ); return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR); } }

定义统一的错误响应体结构:

@Data @AllArgsConstructor public class ErrorResponse { private int status; private String error; private String message; private String timestamp = LocalDateTime.now().toString(); }

处理特定异常类型

针对不同的异常类型定义具体的处理方法:

@ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity<ErrorResponse> handleResourceNotFound( ResourceNotFoundException ex) { ErrorResponse error = new ErrorResponse( HttpStatus.NOT_FOUND.value(), "Resource Not Found", ex.getMessage() ); return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<ErrorResponse> handleValidationExceptions( MethodArgumentNotValidException ex) { List<String> errors = ex.getBindingResult() .getFieldErrors() .stream() .map(FieldError::getDefaultMessage) .collect(Collectors.toList()); ErrorResponse error = new ErrorResponse( HttpStatus.BAD_REQUEST.value(), "Validation Error", errors.toString() ); return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); }

自定义异常类

创建业务特定的异常类型:

public class BusinessException extends RuntimeException { private final ErrorCode errorCode; public BusinessException(ErrorCode errorCode, String message) { super(message); this.errorCode = errorCode; } public ErrorCode getErrorCode() { return errorCode; } }

对应的异常处理:

@ExceptionHandler(BusinessException.class) public ResponseEntity<ErrorResponse> handleBusinessException( BusinessException ex) { ErrorResponse error = new ErrorResponse( ex.getErrorCode().getCode(), ex.getErrorCode().name(), ex.getMessage() ); return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); }

响应内容协商支持

确保异常处理支持多种响应格式(JSON/XML等):

@ControllerAdvice @RequestMapping(produces = {"application/json", "application/xml"}) public class GlobalExceptionHandler { // 处理方法保持不变 }

日志记录集成

在异常处理中加入日志记录:

@ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { logger.error("Unexpected error occurred", ex); // 其余处理逻辑 }

测试验证方法

编写测试用例验证异常处理:

@SpringBootTest @AutoConfigureMockMvc class ExceptionHandlerTest { @Autowired private MockMvc mockMvc; @Test void testResourceNotFound() throws Exception { mockMvc.perform(get("/api/resource/999")) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.error").value("Resource Not Found")); } }

这种实现方式提供了清晰的异常处理结构,使业务代码保持整洁,同时为客户端返回标准化的错误响应。根据项目需求可以进一步扩展,如添加多语言支持、更详细的错误分类等。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 9:36:18

Excalidraw实战教程:如何用自然语言快速生成技术架构图?

Excalidraw实战&#xff1a;用自然语言一键生成技术架构图 在一次跨时区的远程架构评审会上&#xff0c;团队卡在了最基础的问题上——产品经理口述的“用户请求先过网关&#xff0c;再进服务集群”被后端理解为南北向流量模型&#xff0c;而前端却画出了东西向服务网格。这种因…

作者头像 李华
网站建设 2026/9/2 22:55:19

AutoGPT与Notion联动教程:自动整理笔记与知识库更新

AutoGPT与Notion联动&#xff1a;构建自主更新的知识库系统 在信息爆炸的时代&#xff0c;知识工作者每天都在面对海量碎片化内容——论文、博客、课程、会议记录……如何将这些零散信息高效整合成可检索、可复用的知识资产&#xff0c;已成为提升个人与团队生产力的核心挑战。…

作者头像 李华
网站建设 2026/9/2 10:12:47

gLabels-Qt:打造专业标签设计的现代化解决方案

gLabels-Qt&#xff1a;打造专业标签设计的现代化解决方案 【免费下载链接】glabels-qt gLabels Label Designer (Qt/C) 项目地址: https://gitcode.com/gh_mirrors/gl/glabels-qt 在数字化办公日益普及的今天&#xff0c;标签设计已成为企业日常运营中不可或缺的一环。…

作者头像 李华
网站建设 2026/9/3 3:39:08

AI助手评估框架深度解析:从理论到实战的完整指南

AI助手评估框架深度解析&#xff1a;从理论到实战的完整指南 【免费下载链接】agents-course This repository contains the Hugging Face Agents Course. 项目地址: https://gitcode.com/GitHub_Trending/ag/agents-course 你是否曾经困惑于如何客观评估不同AI助手的真…

作者头像 李华
网站建设 2026/9/2 23:59:28

华为OD机考 双机位B/C卷 - 压缩日志查询 (C++ Python JAVA JS C)

题目描述某设备需要记录每分钟检测到的指标值。为了节约存储空间&#xff0c;将连续相同指标值的记录合并。压缩之前&#xff1a; 202411231000,11 202411231001,11 202411231002,12 202411231003,12 202411231004,10 202411231005,17 202411231006,17 202411231007,17压缩之后…

作者头像 李华