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

在Spring Boot中如何实现异常处理?

在Spring Boot中,异常处理可以通过几种方式实现,以提高应用程序的健壮性和用户体验。这些方法包括使用@ControllerAdvice注解、@ExceptionHandler注解、实现ErrorController接口等。下面是一些实现Spring Boot异常处理的常用方法:

1. 使用@ControllerAdvice@ExceptionHandler

@ControllerAdvice是一个用于全局异常处理的注解,它允许你在整个应用程序中处理异常,而不需要在每个@Controller中重复相同的异常处理代码。@ExceptionHandler用于定义具体的异常处理方法。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public ResponseEntity<Object> handleGeneralException(Exception ex, WebRequest request) {Map<String, Object> body = new LinkedHashMap<>();body.put("timestamp", LocalDateTime.now());body.put("message", "An error occurred");return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);}@ExceptionHandler(value = CustomException.class)public ResponseEntity<Object> handleCustomException(CustomException ex, WebRequest request) {Map<String, Object> body = new LinkedHashMap<>();body.put("timestamp", LocalDateTime.now());body.put("message", ex.getMessage());return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);}
}

2. 实现ErrorController接口

如果你想自定义/error路径下的错误页面或响应,可以通过实现Spring Boot的ErrorController接口来实现。

@Controller
public class CustomErrorController implements ErrorController {@RequestMapping("/error")public String handleError(HttpServletRequest request) {// 可以获取错误状态码和做其他逻辑处理Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);if (status != null) {int statusCode = Integer.parseInt(status.toString());// 根据状态码返回不同的视图名或模型}return "errorPage"; // 返回错误页面的视图名}@Overridepublic String getErrorPath() {return "/error";}
}

3. ResponseEntityExceptionHandler扩展

通过扩展ResponseEntityExceptionHandler类,你可以覆盖其中的方法来自定义处理特定的异常。这个类提供了一系列方法来处理Spring MVC抛出的常见异常。

@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {@Overrideprotected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,HttpHeaders headers, HttpStatus status, WebRequest request) {Map<String, Object> body = new LinkedHashMap<>();body.put("timestamp", LocalDateTime.now());body.put("status", status.value());List<String> errors = ex.getBindingResult().getFieldErrors().stream().map(x -> x.getDefaultMessage()).collect(Collectors.toList());body.put("errors", errors);return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);}// 其他异常处理...
}

通过这些方法,Spring Boot允许开发者灵活地处理应用程序中的异常,无论是全局处理还是特定异常的定制化处理,都能以优雅和统一的方式进行。

相关文章:

  • 长贵对赵本山说:你需要我们家大脚,我立马给你配双大鞋!
  • 为什么要用Python?
  • leetcode热题100学习计划-链表-相交链表
  • 【清理mysql数据库服务器二进制日志文件】
  • 如何在 Linux 中快速清空文件而不删除它们?
  • 恭喜莱佛士学生在SPADE室内设计大赛中一举拿下11个奖项
  • 鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
  • Azkaban 大数据 任务调度
  • 认识通讯协议——TCP/IP、UDP协议的区别,HTTP通讯协议的理解
  • 【洛谷 P8682】[蓝桥杯 2019 省 B] 等差数列 题解(数学+排序+辗转相除法)
  • 750541-89-0,mPEG4 phosphonic acid,可以作为催化剂、络合剂
  • spring、springmvc、springboot框架的介绍
  • NOIP 2009普及组初赛试题及解析
  • RunnerGo UI自动化测试脚本如何配置
  • 了解游戏中的数据同步
  • 分享的文章《人生如棋》
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2019.2.20 c++ 知识梳理
  • Cookie 在前端中的实践
  • C语言笔记(第一章:C语言编程)
  • FastReport在线报表设计器工作原理
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • IOS评论框不贴底(ios12新bug)
  • JavaScript异步流程控制的前世今生
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • maven工程打包jar以及java jar命令的classpath使用
  • Node项目之评分系统(二)- 数据库设计
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue学习第二天
  • 闭包,sync使用细节
  • 成为一名优秀的Developer的书单
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 微信小程序设置上一页数据
  • 我的zsh配置, 2019最新方案
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 怎样选择前端框架
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 大数据全解:定义、价值及挑战
  • #图像处理
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (1)(1.9) MSP (version 4.2)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (待修改)PyG安装步骤
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (九)One-Wire总线-DS18B20
  • (力扣)循环队列的实现与详解(C语言)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四)c52学习之旅-流水LED灯
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原)本想说脏话,奈何已放下
  • (转)可以带来幸福的一本书
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据