Spring的三种异常处理方式

1.SpringMVC 异常的处理流程

        异常分为编译时异常和运行时异常,编译时异常我们 try-cache 进行捕获,捕获后自行处理,而运行时异常是不 可预期的,就需要规范编码来避免,在SpringMVC 中,不管是编译异常还是运行时异常,都可以最终由 SpringMVC提供的异常处理器进行统一处理,这样就避免了随时随地捕获处理的繁琐性。

        SpringMVC 处理异常的思路是,一路向上抛,都抛给前端控制器 DispatcherServlet ,DispatcherServlet 在调 用异常处理器ExceptionResolver进行处理,如下图:

 2.SpringMVC 的异常处理方式

 SpringMVC 提供了以下三种处理异常的方式:

  • 简单异常处理器:使用SpringMVC 内置的异常处理器处理SimpleMappingExceptionResolver;
  • 自定义异常处理器:实现HandlerExceptionResolver接口,自定义异常进行处理;
  • 注解方式:使用@ControllerAdvice + @ExceptionHandler 来处理

        1.使用SimpleMappingExceptionResolver处理一些简单异常,配置开启SimpleMappingExceptionResolver, 并指定异常捕获后的处理动作,当发生了异常后,会被 SimpleMappingExceptionResolver 处理,跳转到我们 配置的错误页面error.html给用户进行友好展示 

<!--配置简单异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
 <!-- 异常捕获后动作:展示视图 -->
 <property name="defaultErrorView" value="/error.html"/>
</bean

 可以在配置SimpleMappingExceptionResolver时,指定一些参数,例如:异常的类型

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
 <property name="defaultErrorView" value="/error.html"/>
 <property name="exceptionMappings">
 <props>
 <!-- 配置异常类型对应的展示视图 -->
 <prop key="java.lang.RuntimeException">/error.html</prop>
 <prop key="java.io.FileNotFoundException">/io.html</prop>
 </props>
 </property>
</bean> 

注解方式配置简单映射异常处理器 

@Bean
public SimpleMappingExceptionResolver simpleMappingExceptionResolver(){//创建SimpleMappingExceptionResolverSimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();//设置默认错误展示视图resolver.setDefaultErrorView("/error.html");//定义Properties设置特殊异常对应的映射视图Properties properties = new Properties();properties.setProperty("java.lang.RuntimeException","/error.html");properties.setProperty("java.io.FileNotFoundException","/io.html");resolver.setExceptionMappings(properties);return resolver;
}

 2.自定义异常处理器,实现HandlerExceptionResolver接口自定义异常处理器,可以完成异常逻辑的处理

public class MyHandlerExceptionResolver implements HandlerExceptionResolver {@Override//参数Object是当前目标方法处理器对象HandlerMethodpublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("/error.html");return modelAndView;}
}

交给Spring管理异常处理器

<bean class="com.fly.exception.MyHandlerExceptionResolver"></bean>

自定义异常处理器,返回Json格式字符串信息

@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {//编写要返回的json格式的字符串String jsonStr = "{\"code\":0,\"message\":\"error\",\"data\":\"\"}";try {httpServletResponse.getWriter().write(jsonStr);} catch (IOException e1) {e1.printStackTrace();}return null;}
}

 3.使用注解 @ControllerAdvice + @ExceptionHandler 配置异常,@ControllerAdvice 注解本质是一个 @Component,也会被扫描到,与此同时,具备AOP功能,默认情况下对所有的Controller都进行拦截操作, 拦截后干什么呢?就需要在结合@ExceptionHandler、@InitBinder、@ModelAttribute 注解一起使用了,此 处我们讲解的是异常,所以是@ControllerAdvice + @ExceptionHandler的组合形式

编写全局异常处理器类,使用@ControllerAdvice标注,且@ExceptionHandler指定异常类型

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(RuntimeException.class)public ModelAndView runtimeHandleException(RuntimeException e){System.out.println("全局异常处理器执行...."+e);ModelAndView modelAndView = new ModelAndView("/error.html");return modelAndView;}@ExceptionHandler(IOException.class)@ResponseBodypublic ResultInfo ioHandleException(IOException e){//模拟一个ResultInfoResultInfo resultInfo = new ResultInfo(0,"IOException",null);return resultInfo;}
}

如果全局异常处理器响应的数据都是Json格式的字符串的话,可以使用@RestControllerAdvice替代 @ControllerAdvice 和 @ResponseBody

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(RuntimeException.class)public ResultInfo runtimeHandleException(RuntimeException e){//模拟一个ResultInfoResultInfo resultInfo = new ResultInfo(0,"RuntimeException",null);return resultInfo;}@ExceptionHandler(IOException.class)public ResultInfo ioHandleException(IOException e){//模拟一个ResultInfoResultInfo resultInfo = new ResultInfo(0,"IOException",null);return resultInfo;}
}

3.SpringMVC 常用的异常解析器

接口/类说明
HandlerExceptionResolver异常处理器类的顶级接口,实现了该接口的类都会作为异常处理器类
MyHandlerExceptionResolver自定义的处理器类,实现了HandlerExceptionResolver接口
HandlerExceptionResolverComposite异常解析器混合器,内部存在集合存储多种异常解析器
SimpleMappingExceptionResolver简单映射异常处理器,可以配置异常与对应的错误视图
ExceptionHandlerExceptionResolver异常处理器异常解析器,默认会被注册到Spring容器中,@ExceptionHandler方式 异常处理就是该解析器解析的
DefaultHandlerExceptionResolver默认处理器异常解析器,所有异常处理器都不匹配时,最后执行的异常处理器
ResponseStatusExceptionResolver响应状态异常解析器,结合使用@ResponseStatus标注的异常使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/39616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java:JDBC

文章目录 什么是JDBCJDBC使用步骤详解各个对象DriverManagerConnectionStatementResultSetPreparedStatement JDBC控制事务操作步骤示例 什么是JDBC 我们知道&#xff0c;数据库有很多种&#xff0c;比如 mysql&#xff0c;Oracle&#xff0c;DB2等等&#xff0c;如果每一种数…

C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】

wpf iconfont 外部图标引入&#xff0c;无法正常显示问题。 1. 检查资源路径和引入格式是否正确2. 检查资源是否包含在程序集中 1. 检查资源路径和引入格式是否正确 正确的格式&#xff0c;注意字体文件 “xxxx.ttf” 应写为 “#xxxx” <TextBlock Text"&#xe7ae;…

不重启Docker能添加自签SSL证书镜像仓库吗?

应用背景 在企业应用Docker规划初期配置非安全镜像仓库时&#xff0c;有时会遗漏一些仓库没配置&#xff0c;但此时应用程序已经在Docker平台上部署起来了&#xff0c;体量越大就越不会让人去直接重启Docker。 那么&#xff0c;不重启Docker能添加自签SSL证书镜像仓库吗&…

经典人体模型SMPL介绍(一)

SMPL是马普所提出的经典人体模型&#xff0c;目前已成为姿态估计、人体重建等领域必不可少的基础先验。SMPL基于蒙皮和BlendShape实现&#xff0c;从数千个三维人体扫描结果得来&#xff0c;后通过PCA统计学习得来。 论文&#xff1a;SMPL: A Skinned Multi-Person Linear Mode…

Python读取svn版本

本文将详细介绍如何使用Python读取svn版本。 一、安装svn库 首先&#xff0c;我们需要使用Python来连接svn服务器&#xff0c;并获取版本号。这里我们使用pysvn库来完成这个工作。 pip install pysvn需要注意的是&#xff0c;如果你需要安装特定版本的pysvn&#xff0c;你可…

2023连锁收银系统该如何选?值得推荐的5款连锁收银系统

现在不管是连锁店还是零售店&#xff0c;只要是开店做生意赚钱的&#xff0c;都少不了要和钱打交道&#xff0c;尤其是对连锁店来说&#xff0c;收银工作更是重中之重。 连锁店涉及的门店较多&#xff0c;必须要有一套足够优秀的连锁收银系统&#xff0c;才能做好每个门店的收银…

【ARM 嵌入式 编译系列 5 -- GCC 内建函数 __builtin 详细介绍】

文章目录 什么是GCC内建函数?GCC 常见内建函数GCC内建函数使用示例上篇文章:ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 下篇文章:ARM 嵌入式 编译系列 6 – GCC objcopy, objdump, readelf, nm 介绍 什么是GCC内建函数? GCC提供了一些专门的功能,用于…

使用 `tailwindcss-patch@2` 来提取你的类名吧

使用 tailwindcss-patch2 来提取你的类名吧 使用 tailwindcss-patch2 来提取你的类名吧 安装使用方式 命令行 Cli 开始提取吧 Nodejs API 的方式来使用 配置 初始化 What’s next? tailwindcss-patch 是一个 tailwindcss 生态的扩展项目。也是 tailwindcss-mangle 项目重要…

redis的Key的过期策略是如何实现的?

Key的过期策略 一个redis中可能同时存在很多很多key&#xff0c;这些key可能有很大一部分都有过期时间&#xff0c;此时&#xff0c;redis服务器咋知道哪些key已经过期要被删除&#xff0c;哪些key还没有过期&#xff1f; 如果直接遍历所有的key&#xff0c;显然是行不通的&am…

Abandon_Ubuntu Declaration

鉴于以下几个原因&#xff0c;持续到明年考研结束&#xff0c;我将不再捣鼓ubuntu和任何linux系统&#xff0c; 原因如下&#xff1a; ubuntu23.04不支持wps编辑pdf这个核心功能&#xff0c;且开机向canonial公司发送远程遥测&#xff0c;暂时不会用iptables禁用&#xff0c;故…

第几天(day)

庐阳区2021年信息学竞赛试题 题目描述 Description 给定一个日期&#xff0c;求这一天是当年的第几天。每年的元旦&#xff0c;1月1日&#xff0c;都是每年的第一天&#xff0c;但是每年的最后一天&#xff0c;12月31日&#xff0c;有可能是第365天&#xff0c;也有可能是第3…

2023年上半年网络工程师上午真题及答案解析

1.固态硬盘的存储介质是( )。 A.光盘 B.闪存 C.软盘 D.磁盘 2.虚拟存储技术把( )有机地结合起来使用&#xff0c;从而得到一个更大容量的“内存”。 A.内存与外存 B.Cache与内存 C.寄存器与Cache D.Cache与外存 3.下列接口协议中&…

关于安卓高版本gradle(7.0+)引入aar包报错问题

背景 项目开发过程中&#xff0c;接入三方sdk&#xff0c;引入了本地aar包依赖&#xff0c;as rebuild项目的过程中&#xff0c;报错&#xff0c;提示依赖找不到问题。 报错&#xff1a;“bundleDebugAar FAILED”等 开发环境 win10 jdk11 gradle 7.5 原因 由于gradle的版…

找不到msvcp140.dll无法继续执行代码怎么解决?分享三个解决方法

当你在运行某个程序或游戏时遇到msvcp140.dll缺失的错误提示&#xff0c;你可能会感到困惑和烦恼。在修复msvcp140.dll的过程中&#xff0c;我遇到了一些挑战&#xff0c;但最终成功解决了这个问题。以下是我总结的三个解决方法&#xff0c;希望能帮助你解决这个问题。 找不到m…

Mongodb (四十一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 1.1 相关概念 1.2 特性 二、应用场景 三、安装 四、目录结构 五、默认数据库 六、 数据库操作 6.1 库操作 6.2 文档操作 七、MongoDB数据库备份 7.1 备…

【golang】类型推断和变量重声明

类型推断是一种编程语言在编译期自动解释表达式类型的能力。 1.Go语言的类型推断可以带来哪些好处&#xff1f; 在写代码时&#xff0c;我们通过使用Go语言的类型推断会节省敲击次数&#xff0c;而节省下来的键盘敲击次数几乎可以忽略不记。但它真正的好处&#xff0c;往往会…

小游戏扫雷实现教学(详解)

目录 【前言】 一、模块化程序设计&#xff08;多文件编程&#xff09;介绍 1.概述 2.传统编程的方式 3.模块化程序设计的方法 二、扫雷代码设计思路 三、扫雷代码设计 1.创建菜单函数 2.实现9x9扫雷 3.初始化棋盘 4.打印棋盘 5.随机布置雷的位置 6.排查雷的信息 7.回…

网络安全--利用awk分析Apache日志

一、溯源 你会溯源吗&#xff1f;怎么溯 拿到日志&#xff08;ssh登录日志&#xff0c;Apache日志&#xff09;&#xff0c;通过日志溯到ip&#xff0c;对日志进行每天的拆分&#xff0c;第二通过awk日志分析工具对每天的日志进行拆分&#xff0c;分析某一个ip今天对我访问多…

如何防止DDOS攻击与CC攻击???

防止DDOS&#xff08;分布式拒绝服务&#xff09;和CC&#xff08;网络层阻断&#xff09;攻击需要综合采取多种措施&#xff0c;包括以下几个方面&#xff1a; 1. 增加带宽和资源&#xff1a;通过增加网络带宽和服务器资源&#xff0c;可以扩大系统的吞吐能力&#xff0c;从而…

TEC2083BS-PD码转换器(解决博世矩阵控制PELCO派尔高球机的问题)

TEC2083BS-PD码转换器 使用说明 1.设备概述 控制码转换器在安防工程中起着非常重要的角色&#xff0c;随着高速球型摄像机在安防工程中大范围的使用&#xff0c;而高速球厂家都因为某些原因很少使用博世、飞利浦的协议。为此&#xff0c;工程商经常会遇到博世协议和PELCO协议之…