Spring的三种异常处理方式

这篇具有很好参考价值的文章主要介绍了Spring的三种异常处理方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.SpringMVC 异常的处理流程

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

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

Spring的三种异常处理方式,spring,java

 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(){
     //创建SimpleMappingExceptionResolver
     SimpleMappingExceptionResolver 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是当前目标方法处理器对象HandlerMethod
     public 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 {
     @Override
     public 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)
     @ResponseBody
     public ResultInfo ioHandleException(IOException e){
         //模拟一个ResultInfo
         ResultInfo resultInfo = new ResultInfo(0,"IOException",null);
         return resultInfo;
     }
}

如果全局异常处理器响应的数据都是Json格式的字符串的话,可以使用@RestControllerAdvice替代 @ControllerAdvice 和 @ResponseBody文章来源地址https://www.toymoban.com/news/detail-652076.html

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

3.SpringMVC 常用的异常解析器

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

到了这里,关于Spring的三种异常处理方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 禁用 Swagger 的三种方式

    禁用方法1: ====== 使用注解 @Value() 推荐使用 package com.dc.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; impo

    2024年04月22日
    浏览(46)
  • Spring 框架入门介绍及IoC的三种注入方式

    目录 一、Spring 简介 1. 简介 2. spring 的核心模块 ⭐  二、IoC 的概念 2.1 IoC 详解 2.2 IoC的好处 2.3 谈谈你对IoC的理解 三、IoC的三种注入方式 3.1 构造方法注入 3.2 setter方法注入 3.3 接口注入(自动分配) 3.4 spring上下文与tomcat整合 3.5 总结         Spring框架 是 Java 平台的一个

    2024年02月12日
    浏览(48)
  • spring boot请求http接口的三种方式

    HttpURLConnection 是 Java 中的 HTTP 客户端实现,,适用于简单的请求需要。 HttpURLConnection主要工作内容:打开socket连接,封装http请求报文,解析请求报文。 OkHttp 是一个第三方的 HTTP 客户端库,它比 Java 标准的 HttpURLConnection 更高效、更实用。主要特点包括: 比 HttpURLConnection 快得多

    2024年02月14日
    浏览(63)
  • Spring Boot获取resources目录下的文件的三种方式

    在Spring Boot项目中,经常需要获取 resources 目录下的文件。这些文件可以包括配置文件、模板文件、静态资源等。本文将介绍三种常用的方法来获取 resources 目录下的文件。 ResourceLoader 接口是Spring框架提供的用于加载各种资源的接口,包括 classpath 下的资源。在Spring Boot中,可

    2024年02月16日
    浏览(60)
  • 【spring Cloud】微服务通信的三种方式RestTemplate、Feign远程调用与Dubbo的使用

    目录 一、通过RestTemplate调用微服务 二、通过Feign远程调用 三、Dubbo  分布式中的远程调用大概分为两种 RESTful接口  REST,即Representational State Transfer的缩写,如果一个架构符合REST原则,就称它为RESTful架构。 每一个URI代表一种资源; 客户端和服务器之间,传递这种资源的某种

    2024年04月11日
    浏览(48)
  • Java 将word转为PDF的三种方式和处理在服务器上下载后乱码的格式

    我这边是因为业务需要将之前导出的word文档转换为PDF文件,然后页面预览下载这样的情况。之前导出word文档又不是我做的,所以为了不影响业务,只是将最后在输出流时转换成了PDF,当时本地调用没什么问题,一切正常,后面发布测试环境使用时才发现,导出时PDF文件内容

    2024年02月03日
    浏览(47)
  • 【Spring框架】spring对象注入的三种方法

    属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。 依赖注入 VS 依赖查找 -依赖查找依赖 Bean -@Autowired 依赖注入流程:首先先根据getType(从容器中)获取对象,如果只获取一个,那么直接将此对象注入到当前属性上;如果获取到多个对象,才会使用getName(根据名

    2024年02月15日
    浏览(51)
  • 【Spring篇】讲解Bean的三种配置和实例化方法

    🎊专栏【Spring】 🍔喜欢的诗句:天行健,君子以自强不息。 🎆音乐分享【如愿】 🎄欢迎并且感谢大家指出小吉的问题🥰 在Spring框架中,Bean的配置和实例化是很重要的基础内容。掌握各种配置方式,才能灵活管理Bean对象。本文将全面介绍Bean的别名配置、作用范围配置,以及

    2024年02月08日
    浏览(52)
  • Java创建文件的三种方式

    内容来自于韩顺平学Java 在学习其视频下跟着编写 文件创建成功

    2024年04月11日
    浏览(66)
  • Java创建数组的三种方式

    这种一般用的比较多。 数组类型 [ ]  数组名称  =  new 数组类型 [ 数组长度 ] 

    2024年02月03日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包