news 2026/6/8 23:20:26

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/6/9 11:37:59

卡牌游戏(Java/python/JavaScript/C/C++)

小明正在尝试一种新的牌游戏。游戏规则只如下:首先&#xff0c;小明拿到一张写有数字m的牌。 然后&#xff0c;他会拿到另外n张牌&#xff0c;上面分别写有不同的数字&#xff0c;牌排成一排。小明的目标是从这排牌中找到一串连续的牌&#xff0c;这些牌上数字的总和可以被 m整…

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

Foundation 模态框

Foundation 模态框&#xff08;Reveal / Modal&#xff09;详解&#xff08;超级完整版&#xff0c;一次讲透&#xff09; 我们继续你的 Foundation 系列&#xff0c;今天把 模态框&#xff08;Reveal&#xff09;讲得明明白白&#xff01;Foundation 6 中的 Reveal 是最强大的…

作者头像 李华
网站建设 2026/6/7 13:58:27

Vim光标移动效率革命:EasyMotion与Sneak终极对决

Vim光标移动效率革命&#xff1a;EasyMotion与Sneak终极对决 【免费下载链接】vim-galore :mortar_board: All things Vim! 项目地址: https://gitcode.com/gh_mirrors/vi/vim-galore 还在为Vim中缓慢的光标移动而苦恼&#xff1f;今天我们将深入对比两款改变游戏规则的…

作者头像 李华
网站建设 2026/6/9 16:23:10

游戏公司渲染软件管控:错峰使用遗传算法降采购成本

游戏公司渲染软件管控&#xff1a;错峰使用遗传算法降采购成本前言&#xff1a;成本节约不是选择题&#xff0c;是必答题在游戏行业竞争日益激烈的背景下&#xff0c;成本控制已经成为决定企业生存与发展的关键因素之一。是像渲染软件这类高性能、高投入的工具&#xff0c;对于…

作者头像 李华
网站建设 2026/6/8 22:53:02

19、多种操作系统在VMware中的使用指南

多种操作系统在VMware中的使用指南 1. Solaris系统相关 1.1 Solaris启动过程 Solaris Intel平台版通过两步启动。首先从DOS分区加载一个(DOS)配置助手。若以交互模式进入该助手(首次安装时会这样),可以从其他设备启动并探测新添加的硬件,也能扫描特定硬件,但要注意,…

作者头像 李华