Spring Boot应用中的异常处理

楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异常处理方法

但是平时大家的工作一般是基于开发框架进行的(比如Spring MVC,或Spring Boot),所以会有相应特定的异常处理方法,这篇文章要介绍的就是web应用中的异常处理。

想快速解决问题的小伙伴可以只看“解决办法”,想进一步了解细节的小伙伴还可以看“深入剖析”部分。

适用场景

使用Spring MVC或Spring Boot框架搭建的web应用

解决办法

@ControllerAdvice注解 + @ExceptionHandler注解

实现一个异常处理类,在类上应用@ControllerAdvice注解,并在异常处理方法上应用@ExceptionHandler注解。那么在web应用中,当Controller的@RequestMapping方法抛出指定的异常类型时,@ExceptionHandler修饰的异常处理方法就会执行。

示例:

@ControllerAdvicepublic class WebServerExceptionHandler { Logger log = LoggerFactory.getLogger(this.getClass()); public WebServerExceptionHandler() { } // 指定捕获的异常类型,这里是自定义的SomeException @ExceptionHandler({SomeException.class}) public ResponseEntity handle(HttpServletResponse response, SomeException ex) { WebServerExceptionResponse body = new WebServerExceptionResponse(); body.setStatus(ex.getStatus()); body.setMessage(ex.getMessage()); this.log.info(“handle SomeException, status:{}, message:{}”, new Object[]{body.getStatus(), body.getMessage()}); return new ResponseEntity(body, HttpStatus.valueOf(ex.getStatus())); } // 指定捕获的异常类型,这里是自定义的OtherException @ExceptionHandler({OtherException.class}) public ResponseEntity handle(HttpServletResponse response, OtherException ex) { WebServerExceptionResponse body = new WebServerExceptionResponse(); body.setStatus(ex.getStatus()); body.setMessage(ex.getMessage()); this.log.info(“handle OtherException, status:{}, message:{}”, new Object[]{body.getStatus(), body.getMessage()}); return new ResponseEntity(body, HttpStatus.valueOf(ex.getStatus())); }}

深入剖析

@ControllerAdvice的定义如下:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface ControllerAdvice { String[] value() default {}; String[] basePackages() default {}; Class[] basePackageClasses() default {}; Class[] assignableTypes() default {}; Class[] annotations() default {};}

可以看出它应用在TYPE类型的元素上(也即class或interface),运行时生效。

作用是Controller类的帮助注解,一般搭配@ExceptionHandler注解,用来处理Controller的@RequestMapping修饰的方法抛出的异常。

楼主根据源码注释整理了5个参数的含义,它们都是用来限定需要处理的Controller的:

  • value():等同于basePackages,表示需要被处理的Controller包名数组,例如 @ControllerAdvice(“org.my.pkg”)。如果不指定,就代表处理所有的Controller类
  • basePackages():表示需要被处理的Controller包名数组,例如 @ControllerAdvice(basePackages={“org.my.pkg”,”org.my.other.pkg”})
  • basePackageClasses():通过标记类来指定Controller包名数组
  • assignableTypes():通过类的Class对象来指定Controller包名数组
  • annotations():被注解修饰的Controller需要被处理

性能考虑:不要指定过多的参数和异常处理策略,因为异常检查和处理都是在运行时做的。

@ExceptionHandler的定义如下:

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ExceptionHandler { /** * Exceptions handled by the annotated method. If empty, will default to any * exceptions listed in the method argument list. */ Class[] value() default {};}

可以看出它作用在方法上面,而且参数很好理解,就是需要处理的异常类的Class对象数组。

但是,它对修饰的异常处理方法的参数和返回值有限定,楼主根据源码的注释整理如下:

(1)异常处理方法的参数限定,可以是以下类型,顺序任意:

  • 异常类对象
  • HttpServletRequest、HttpServletResponse
  • HttpSession
  • InputStream/Reader、OutputStream/Writer

(2)异常处理方法的返回值限定,最终会写入response流:

  • ResponseEntity
  • HttpServletResponse
  • ModelAndView
  • Model
  • Map
  • View

总结

以上就是在Spring web应用中的异常处理方法:使用@ControllerAdvice搭配@ExceptionHandler修饰自定义异常处理方法,处理来自Controller类中的@RequestMapping方法抛出的异常。

使用时需要根据实际情况,合理设置@ControllerAdvice和@ExceptionHandler的参数。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月22日
下一篇 2022年6月22日

相关推荐

  • Android音视频开发-Media FrameWork框架与源码解析

    一、Media FrameWork背景 Media Framework (媒体函数库):此函数库让Android 可以播放与录制许多常见的音频与视频文件,支持的文件类型包括MPEG…

    2022年6月25日
  • CNN和Transformer正确结合方法,有效的下一代视觉Transformer

    机器之心报道 机器之心编辑部 来自字节跳动的研究者提出了一种能在现实工业场景中有效部署的下一代视觉 Transformer,即 Next-ViT。Next-ViT 能像 CNN 一…

    2022年7月24日
  • 皱纹 多种皱纹的去除方法

    面部的皱纹最容易暴露年龄,想要面容生动不留衰老迹象, 就要肯下功夫,将皱纹抚平,做个光洁亮丽的时光美人。 去除表情纹、缺水纹 脆弱的肌肤容易形成皱纹,适当按摩能够舒展肌肤,减少皱纹…

    2022年7月3日
  • 微信支付被曝出现异常,无法完成支付

    IT之家 6 月 16 日消息,据部分IT之家读者和一些微博用户反映,微信支付疑似出现异常,无法完成支付。 IT之家测试用微信发红包可以正常发出,官方还未对此做出回应。

    2022年6月16日
  • 俄罗斯三颗Gonets卫星或于10月22日在东方港发射

    据塔斯社 8月5日报道,一名火箭和航天工业消息人士告诉塔斯社,三颗Gonets卫星将于10月底从俄罗斯远东的东方港航天中心首次发射。 图片来自:Google 该消息人士称:“东方港…

    2022年8月17日
  • 一文参透并发编程,阿里大牛两万字总结 +40 张图文详解

    分布式模型的思想就是借鉴并发模型的基础上推演发展来的。 认识两个状态 并发模型的一个重要的方面是,线程是否应该共享状态,是具有共享状态还是独立状态。共享状态也就意味着在不同线程之间…

    2022年6月22日
  • oppor9呼吸灯怎么换色,oppor9设置呼吸灯换颜色设置方法

    习惯了安卓手机的用户都知道,基本上每部安卓手机身上都会配备一个实用的呼吸灯,能够在手机接受到新消息后闪烁,从而提醒用户查看消息,一方面方便了日常的使用,另一面也让手机多几分些灵性。…

    2022年10月25日
  • 红米note12参数怎么样 红米note12详细配置介绍

    红米note12参数配置怎么样?红米手机在昨日的发布会上正式公布了note12系列,共有4款新机,那么红米note12参数配置怎么样呢?下面就让小编为大家介绍一下红米note12参…

    2022年10月28日
  • 技术分享 触屏操作自动化

    导入TouchAction Python 版本 from appium.webdriver.common.touch_action import TouchAction Java …

    2022年6月22日
  • 大家有什么存钱的好方法吗?

    我是60后,我离婚的23年里,从一无所有(我离婚是净身出户的,真正的一无所有)到有房有车,基本就是靠拼命工作+努力省钱这样得来的。 我的方法是我自己总结出来的: 我每年定期或不定期…

    2022年5月4日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息