1. Spring 提供了多种方式将异常转换为相应
    1. Spring框架提供的通用异常,将异常转换为HTTP状态码
      1. Spring默认会将自身抛出的异常自动映射到合适的状态码,如下是一些示例:

        举个例子,当后端抛出如下异常(TypeMismatchException异常,往方法传参时,类型不匹配):

        org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'long'; nested exception is java.lang.NumberFormatException: For input string: "2l"
        at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:77)
        at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:47)
        at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:603)
        ...

        前台返回400状态码:

    2. 在异常上可以添加@ResponseStatus注解,从而将普通异常转换为HTTP状态码
      1. 除了以上异常,对于其它异常以及我们业务自己抛出的异常,如果没有明确绑定Http状态码,响应默认都会带有500状态码。
      2. 当然,除了这些默认机制,我们也可以将自定义异常绑定特点的Http状态码,通过@ResponseStatus注解可实现,如下示例:

        定义一个异常,通过@ResponseStatus注解绑定400状态码:

        @ResponseStatus(value = HttpStatus.NOT_FOUND)
        public class MyException extends RuntimeException
        { }

        然后再controller抛出自定义异常throw new MyException();

        访问controller,发现响应确实返回了400状态码。

    3. 在方法上添加@ExceptionHandler注解,使得控制器方法具备处理异常的能力
      1. 控制器内部异常,在控制器内部处理
      2. 我们在controller下添加了一个MyException异常的处理方法,直接返回到body。适用于控制器内部,抛出“MyException.class”的方法。如果控制内部抛出的有其他类型的异常,如OtherException,再在控制器内部添加一个“@ExceptionHandler(OtherException.class)”即可

            @ExceptionHandler(MyException.class)
        @ResponseBody
        public String handleException(){
        return "handle by ExceptionHandler.";
        }

        打开浏览器,观察结果:

    4. 控制器通知(@ControllerAdvice)
      1. 用户添加异常处理全局机制,避免在每个控制内内部定义独立的异常控制流程
      2. @ControllerAdvice最实用定义场景是将所有@ExceptionHandler方法收集到一个类中,这样所有控制器的异常可以在一个进行一致的处理
      3. 异常处理方法只能处理同一个controller中抛出的异常,然而一个系统,肯定不止一个controller,总不可能在每个controller中都添加重复性的异常处理方法吧~~

        那么对于多个controller,如何处理异常呢?使用@ControllerAdvice注解即可。

      4. 有一个点注意下,就是spring 扫描配置的时候,要包括该bean,参考配置如下,可参考:
        1. spring-mvc.xml:
          
              <context:component-scan base-package="com.cetiti.epdc.dss" >
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
          <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
          </context:component-scan> spring.xml <context:component-scan base-package="com.cetiti.epdc.dss">
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
          <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
          </context:component-scan> 另外,在上面的示例中,范围更小的异常,优先级更大,所以会调用handleNumberFormatException方法。
      5. 带有@ControllerAdvice注解的类,可以收到系统中所有Controller抛出的异常,如下示例:

        @ControllerAdvice
        public class DSSExceptionHandler extends BaseController
        { /**
        * 处理controller抛出的异常
        *
        * @return
        */
        @ExceptionHandler(Exception.class)
        @ResponseBody
        public String handleException(HttpServletRequest request, Exception e)
        {
        logger.error("Request FAILD, URL = {} ", request.getRequestURI());
        logger.error(e.toString(), e);
        return gson.toJson(BaseController.FAILD);
        } /**
        * 处理controller抛出的异常
        *
        * @return
        */
        @ExceptionHandler(NumberFormatException.class)
        @ResponseBody
        public String handleNumberFormatException(HttpServletRequest request, NumberFormatException e)
        {
        logger.error("Request FAILD, URL = {} ", request.getRequestURI());
        logger.error(e.toString(), e);
        return gson.toJson(BaseController.FAILD);
        } }
         
  2. 下面是几个ExceptionHandler注解的使用例子:

    @Controller
    public class ExceptionHandlingController { // @RequestHandler methods
    ... // 以下是异常处理方法 // 将DataIntegrityViolationException转化为Http Status Code为409的响应
    @ResponseStatus(value=HttpStatus.CONFLICT, reason="Data integrity violation") //
    @ExceptionHandler(DataIntegrityViolationException.class)
    public void conflict() {
    // Nothing to do
    } // 针对SQLException和DataAccessException返回视图databaseError
    @ExceptionHandler({SQLException.class,DataAccessException.class})
    public String databaseError() {
    // Nothing to do. Returns the logical view name of an error page, passed to
    // the view-resolver(s) in usual way.
    // Note that the exception is _not_ available to this view (it is not added to
    // the model) but see "Extending ExceptionHandlerExceptionResolver" below.
    return "databaseError";
    } // 创建ModleAndView,将异常和请求的信息放入到Model中,指定视图名字,并返回该ModleAndView
    @ExceptionHandler(Exception.class)
    public ModelAndView handleError(HttpServletRequest req, Exception exception) {
    logger.error("Request: " + req.getRequestURL() + " raised " + exception); ModelAndView mav = new ModelAndView();
    mav.addObject("exception", exception);
    mav.addObject("url", req.getRequestURL());
    mav.setViewName("error");
    return mav;
    }
    }
  3. 参考 https://www.cnblogs.com/junzi2099/p/7840294.html
  4. 参考 https://www.cnblogs.com/chenpi/p/6117090.html

Spring 梳理 -异常处理的更多相关文章

  1. Spring Boot异常处理详解

    在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...

  2. Spring Boot 异常处理

    Spring Boot 异常处理 本节介绍一下 Spring Boot 启动时是如何处理异常的?核心类是 SpringBootExceptionReporter 和 SpringBootExcepti ...

  3. Spring Boot异常处理

    一.默认映射 我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局 ...

  4. Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

  5. Spring 全局异常处理

    [参考文章]:Spring全局异常处理的三种方式 [参考文章]:Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 [参考文章]:@ControllerAdvic ...

  6. Spring MVC异常处理SimpleMappingExceptionResolver

    Spring MVC异常处理SimpleMappingExceptionResolver[转] (2012-12-07 13:45:33) 转载▼ 标签: 杂谈 分类: 技术分享 Spring3.0中 ...

  7. Spring统一异常处理

    1.为什么要用Spring的统一异常处理? 项目中无论是controller层.service层还是dao层都会有异常发生.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量 ...

  8. Spring MVC异常处理代码完整实例

    Spring MVC异常处理流程: 提供构造方法传值: 配置异常处理器的bean

  9. 一文带你掌握Spring Web异常处理方式

    一.前言 大家好,我是 去哪里吃鱼 ,也叫小张. 最近从单位离职了,离开了五年多来朝朝夕夕皆灯火辉煌的某网,激情也好悲凉也罢,觥筹场上屡屡物是人非,调转过事业部以为能换种情绪,岂料和下了周五的班的前同 ...

随机推荐

  1. cucumber测试框架

    1.1 什么是BDD(行为驱动开发)  首先了解一个概念,BDD(BehaviorDrivenDevelopment:行为驱动开发)为用户提供了从 开发人员和客户的需求创建测试脚本的机会.因此,开始时 ...

  2. Unity官方案例精讲_2015_优化

    1.将公共变量从Inspector视图中隐藏:    [HideInInspector] [HideInInspector] public GameObject player; 2.限定Inspect ...

  3. effective java 3th item1:考虑静态工厂方法代替构造器

    传统的方式获取一个类的实例,是通过提供一个 public 构造器.这里有技巧,每一个程序员应该记住.一个类可以对外提供一个 public 的 静态工厂方法 ,该方法只是一个朴素的静态方法,不需要有太多 ...

  4. 第三篇 视觉里程计(VO)的初始化过程以及openvslam中的相关实现详解

    视觉里程计(Visual Odometry, VO),通过使用相机提供的连续帧图像信息(以及局部地图,先不考虑)来估计相邻帧的相机运动,将这些相对运行转换为以第一帧为参考的位姿信息,就得到了相机载体( ...

  5. 理解Js的parseInt(转)

    parseInt() 方法首先查看位置 0 处的字符,判断它是否是个有效数字:如果不是,该方法将返回 NaN,不再继续执行其他操作.但如果该字符是有效数字,该方法将查看位置 1 处的字符,进行同样的测 ...

  6. Java NIO 下

    内存映射文件 JAVA处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的IO类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer. ...

  7. CodeForces 402 E Strictly Positive Matrix

    Strictly Positive Matrix 题解: 如果原来的 a[i][j] = 0, 现要 a[i][j] = 1, 那么等于 sum{a[i][k] + a[k][j]} > 1. ...

  8. hdu 3577 Fast Arrangement(线段树区间修改,求区间最小值)

    Problem Description Chinese always have the railway tickets problem because of its' huge amount of p ...

  9. Bytes类型

    Bytes类型 一.定义 bytes类型是指一堆字节的集合,在python中以b开头的字符串都是bytes类型. b'\xe5\xb0\x8f\xe7\x8c\xbf\xe5\x9c\x88' ''' ...

  10. SpringBoot发送邮箱验证码

    一.开启QQ邮箱服务 (1)登陆QQ找到设置,点击账户 (2)往下拉,开启POP3/SMTP服务和IMAP/SMTP服务 当开启IMAP/SMTP会有一串密文密码,保存起来后面要用到 二.spring ...