Java中的全局异常处理器 -- GlobalExceptionHandler

devtools/2024/9/20 13:37:46/ 标签: java, spring boot

========================
开发记录:全局异常处理器笔记

java">import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.MyBatisSystemException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.RedisConnectionFailureException;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.ConnectException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;import static com.tal.markms.common.CommonConstant.SOCKET_EXCEPTION;@Slf4j
@RestControllerAdvice(basePackages = {"com.tal.markms"})
public class GlobalExceptionHandler {@Value("${spring.profiles.active}")private String env;/*** COMMON异常,自定义异常** @param ce* @param request* @return*/@ExceptionHandler(BizException.class)@ResponseBody@ResponseStatus(HttpStatus.OK)private HttpResult commonExceptionHandler(BizException ce, HttpServletRequest request) {log.info("BizException:{}={}", ce.getErrCode().getMessage(), request != null ? request.getRequestURL() : "no-url", ce);return new HttpResult(ce.getErrCode().getCode(), ce.getErrCode().getMessage());}@ExceptionHandler(HttpMessageNotReadableException.class)@ResponseBody@ResponseStatus(HttpStatus.OK)private HttpResult requestConverterExceptionHandler(HttpMessageNotReadableException ce, HttpServletResponse response) {log.info("HttpMessageNotReadableException:{}", ce.getMessage() + "--" + ce.getLocalizedMessage());return new HttpResult(ErrorCode.SystemError.ERROR_INVALID_PARAM.getCode(), "提交参数错误" );}@ExceptionHandler(Exception.class)@ResponseBody@ResponseStatus(HttpStatus.OK)public HttpResult runtimeExceptionHandler(Exception e, HttpServletRequest request) {log.error("RuntimeExceptionHandler -> e={}={}", e.getLocalizedMessage(), (request != null ? request.getRequestURL() : "no-url"), e);doOriginalException(e);if ("dev".equals(env)) {e.printStackTrace();}return new HttpResult(ErrorCode.SystemError.ERROR_SYSTEM_ERROR.getCode(), "服务处理错误,请联系管理员查看原因");}private void doOriginalException(Throwable original) {if (original instanceof SocketException|| original instanceof RedisConnectionFailureException|| original instanceof UnknownHostException|| original instanceof SocketTimeoutException|| original instanceof MyBatisSystemException|| original instanceof ConnectException) {log.error(SOCKET_EXCEPTION, original.getMessage());}}
}

@ControllerAdvice 和 @ResponseBody 是 Spring 框架中用于处理控制器层逻辑的两个注解,它们各自的作用如下:

@ControllerAdvice

@ControllerAdvice 是一个增强控制器的注解,允许你定义全局的异常处理、数据绑定、以及数据格式化等功能,应用于多个控制器类。它的主要作用有:

  • 1、全局异常处理:
    • 可以为所有控制器统一定义异常处理逻辑,而无需在每个控制器中重复定义。
    • 使用 @ExceptionHandler 方法捕获并处理指定类型的异常。
  • 2、全局数据绑定:
    • 可以使用 @InitBinder 注解的方法,为所有控制器提供统一的数据绑定逻辑。
  • 3、全局数据格式化:
    • 使用 @ModelAttribute 注解的方法,可以为所有控制器统一添加模型数据。
java">@ControllerAdvice
public class GlobalControllerAdvice {// 处理所有类型为 BizException 的异常@ExceptionHandler(BizException.class)public ResponseEntity<String> handleBizException(BizException ex) {return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());}// 可以初始化绑定器,用于全局的数据绑定处理@InitBinderpublic void initBinder(WebDataBinder binder) {// 例如,注册一个自定义编辑器binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));}// 为所有请求提供一个默认的模型属性@ModelAttributepublic void addAttributes(Model model) {model.addAttribute("projectName", "My Project");}
}

@ResponseBody

@ResponseBody 注解用于将控制器方法的返回值直接作为 HTTP 响应体返回给客户端,而不是默认的视图解析器处理。其主要作用是:

  • 1、返回 JSON 或 XML:
    • 通常用于 RESTful 风格的控制器,返回 JSON、XML 或其他格式的数据。
    • 通过 Spring 的消息转换器自动将返回对象转换为适当的格式。
  • 2、简化响应处理:
    • 不需要返回 ModelAndView,而是直接返回对象,Spring 会负责转换为 HTTP 响应。
java">@RestController // 等同于 @Controller + @ResponseBody
public class UserController {// 返回 JSON 格式的用户数据@GetMapping("/user/{id}")public User getUser(@PathVariable Long id) {// 查询用户逻辑return userService.findById(id);}// 在单个方法上使用 @ResponseBody@GetMapping("/status")@ResponseBodypublic String status() {return "OK";}
}

Over !


http://www.ppmy.cn/devtools/95222.html

相关文章

透明加密技术

透明加密技术&#xff0c;也被称为透明数据加密&#xff08;Transparent Data Encryption, TDE&#xff09;&#xff0c;是一种加密方法&#xff0c;它允许数据在存储时自动加密和解密&#xff0c;而不需要用户进行任何手动操作。透明加密技术主要应用于数据库、文件系统和磁盘…

第十六章:开发应用的最佳实践

本章内容包括&#xff1a; 了解在一个典型应用中会出现哪些kubernetes的资源添加pod启动后和停止前的生命周期钩子在不断开客户端连接的情况下妥善的停止应用在kubernetes中如何方便管理应用在pod中使用init容器使用minikube在本地进行应用开发 1 集中一切资源 我们⾸先看看⼀…

【xilinx】Xilinx最强FPGA VU系列简介

在高性能计算和数据处理领域&#xff0c;FPGA扮演着日益重要的角色。Xilinx的Virtex™ UltraScale™&#xff08;VU&#xff09;系列以其卓越的性能和灵活性&#xff0c;为各种高端应用提供了强有力的支持。以下是关于VU系列的详细介绍。 AMD Virtex™ UltraScale™ 产品优势 …

tomcat Listener 内存马浅谈

本文来源无问社区&#xff0c;更多实战内容可前往查看http://www.wwlib.cn/index.php/artread/artid/3651.html Tomcat 介绍 Tomcat的主要功能 toncat作为一个web服务器&#xff0c;实现了两个核心的功能 http 服务器功能&#xff1a;进行socket 通信&#xff08;基于TCP/I…

【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分

✨ 人生如梦&#xff0c;朝露夕花&#xff0c;宛若泡影 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…

凭借这份《2024测试面经》候选者逆袭面试官,offer拿到手软

《2024测试面经》800 道软件测试面试真题&#xff0c;高清打印版打包带走&#xff0c;横扫软件测试面试高频问题&#xff0c;涵盖测试理论、Linux、MySQL、Web 测试、接口测试、App 测试、Python、Selenium、性能测试、LordRunner、计算机网络、数据结构与算法、逻辑思维、人力…

开发干货 | 七夕爆款智能体是怎么做的?4篇开发拆解都在这里了

上周六8月10日是咱们传统节日七夕 平台上线了七夕专项创意智能体 还没玩过的朋友戳&#x1f449;&#x1f3fb;七夕速来AI一下&#x1f448;&#x1f3fb; 这样新颖、有创意的智能体是如何构思的&#xff1f; 又是如何实现创意开发的呢&#xff1f; 一起来看开发者的干货分享…

Zotero更改插入word中所有引用编号的颜色

002-如何批量更改Zotero插入在word中参考文献的颜色&#xff08;快速变蓝&#xff09; 主要根据此视频进行学习。 需要记住 查找的内容为&#xff1a; ^19 ADDIN ZOTERO_ITEM 在word中打开 文件->更多->选项->高级 下滑选择域底纹&#xff0c; 可以看到所有的引用 …

Trilium Notes:你的个人知识库!【送源码】

简介 Trilium Notes是一款功能全面的层次化笔记应用&#xff0c;通过树形结构构建个人知识库&#xff0c;支持Markdown编辑、网页内容剪切、笔记搜索与映射&#xff0c;并特别提供了基于画布的自由涂画功能&#xff0c;极大地提升了笔记的灵活性和创造性&#xff0c;是知识管理…

Web开发-CSS篇-下

1. 盒子模型介绍 盒子模型是CSS布局的基础&#xff0c;每个HTML元素都被看作是一个矩形盒子。盒子模型主要由以下四个部分组成&#xff1a; Content&#xff1a;内容区域&#xff0c;显示文本和图片。Padding&#xff1a;内边距&#xff0c;围绕内容的空白区域。Border&#x…

Linux 虚拟机 CentOs7系统 配置

Linux centos7 虚拟机配置 虚拟机配置 网络安装&#xff1a; #配置网络IP地址 cd /etc ls cd sysconfig/ cd network-scripts vi ifcfg-ens33 #输入i进入编辑模式&#xff08;不能用滚轮&#xff01;只能按上下键&#xff09; ONBOOT值改为yes #按esc&#xff0c;然后输入:w…

【热门文章】Eureka原理实践

以下是关于“Eureka 原理实践”的一些可能的步骤和要点&#xff1a; 一、Eureka 原理概述 Eureka 是 Netflix 开发的服务发现框架&#xff0c;其核心原理包括服务注册、服务发现和心跳机制。 服务注册&#xff1a;服务提供者在启动时将自身的信息&#xff08;如服务名称、IP 地…

案例分享—国外毛玻璃效果UI设计案例

毛玻璃效果通过模糊和半透明特性&#xff0c;显著增强了UI界面的层次感和深度&#xff0c;使得元素之间界限清晰&#xff0c;同时赋予界面一种现代、高级的质感&#xff0c;提升了整体视觉吸引力。 该效果不仅美观&#xff0c;还通过柔和的色彩和光照效果营造出清新、轻松的氛围…

LangChain学习

官方定义是&#xff1a;LangChain是一个强大的框架&#xff0c;旨在帮助开发人员使用语言模型构建端到端的应用程序&#xff0c;它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain是一个语言模型集成框架…

闲鱼功能全解析:闲置物品快速变现

咸鱼&#xff08;现已更名为闲鱼&#xff09;作为一款闲置交易平台&#xff0c;其功能设计旨在提供一个方便、安全的环境&#xff0c;让用户能够轻松地买卖二手物品。以下是对咸鱼&#xff08;闲鱼&#xff09;功能的详细分析 1. 商品发布与管理 商品发布&#xff1a;用户可以…

LeetCode-3148. 矩阵中的最大得分

本人算法萌新,为秋招找工作开始磨炼算法,算法题均用python实现,如果我有哪些地方做的有问题的,还请大家不吝赐教. 1.题干 给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&…

共塑AI新篇章 | 云轴科技ZStack亮相2024中国操作系统产业大会

近日&#xff0c;以“麒麟遨天 AI创无界 “为主题的2024中国操作系统产业大会”在北京举办&#xff0c;云轴科技ZStack受邀出席&#xff0c;并凭借与麒麟软件的紧密合作和在AI领域的创新成果&#xff0c;荣获“最佳合作奖”。双方已在产品适配、技术创新、市场发展等方面展开深…

html+css+js网页制作 自定义电商10个页面

htmlcssjs网页制作 自定义电商10个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

近十年首款!肝病“first-in-class”PPAR激动剂获FDA批准

新药概述&#xff1a; 2024年6月11日&#xff0c;FDA加速批准Ipsen和Genfit的Iqirvo&#xff08;Elafibranor&#xff09;上市&#xff0c;用于治疗成人原发性胆汁性胆管炎&#xff08;PBC&#xff09;。Elafibranor是近十年首款用于治疗这类肝病的“first-in-class”小分子药…

.Net 填坑 接口、父类、子类同名方法的调用

.Net 填坑 接口、父类、子类同名方法的调用 先看代码 1.类与接口定义 class B : IDisposable, Test{public void Dispose(){Console.WriteLine("B Dispose");}public virtual void Test(){Console.WriteLine("B Test");}}interface Test{void Test();}cl…