zoukankan      html  css  js  c++  java
  • @ControllerAdvice @ExceptionHandler @ResponseStatus spring全局异常拦截

    1:@ControllerAdvice:全局捕获异常,异常集中处理,更好的使业务逻辑与异常处理剥离开

    • 把@ControllerAdvice定义在一个类上,该类则负责捕获所有@RequestMapping上发生的异常(包括controller调用的service)

    2:@ExceptionHandler(value = Exception.class):统一处理某一类异常

    • 把@ExceptionHandler(value = Exception.class)定义在一个方法上,声明该方法用于捕获value所指的类型的异常(注意:当该异常的子父类都被声明时,按照先子后父的顺序进行捕获)
    • 在方法中捕获到异常进行处理后,即可重定向到一个视图,也可返回一个json;此时需要@ResponseBody。

    3:@ResponseBody

    •    和@ExceptionHandler一同用在方法上,声明在方法中捕获到异常并进行处理后,返回的数据类型不是html页面,而是某种格式的数据。(@ResponseBody的本质作用)

     4:@ResponseStatus:将某种异常映射为HTTP状态码,可用在方法上,也可以用在类上(自定义运行时异常类)。

    • 当作用到异常类上时,实际上就是将该异常类的对象转换成某个HTTP状态码,然后以该状态码去通知客户端。(本文不再讨论)
    • 当作用到方法上时,实际上就是改变方法返回值的HTTP状态码,然后返回给客户端。

    例子如下:

    补充:上图例子虽然是对GunsException异常的捕获,并在方法中进行了处理,最终在方法返回时,如果没有加上@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR),则该方法返回给客户端的状态码是200(即正常状态码),如果是ajax发送的请求,则会回调success()方法。但是加上@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)之后,该方法返回给客户端的状态码就变了。所以:@ResponseStatus如果加在方法上,就是改变方法返回值的HTTP状态码。

  • 相关阅读:
    hdu5628 Clarke and math
    LOJ#2452. 「POI2010」反对称 Antisymmetry
    LOJ#2444. 「NOI2011」阿狸的打字机
    BZOJ2795: [Poi2012]A Horrible Poem
    LOJ#2427. 「POI2010」珍珠项链 Beads
    云主机文件系统readonly处理案例
    兼容性测试中如何切换和管理多个JDK版本
    Promise之你看得懂的Promise
    一次MySQL线上慢查询分析及索引使用
    考拉消息中心消息盒子处理重构(策略模式)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302506.html
Copyright © 2011-2022 走看看