异常与HTTP状态码的映射(@ResponseStatus)

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:)
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:)
at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:)
...

前台返回400状态码:

除了以上异常,对于其它异常以及我们业务自己抛出的异常,如果没有明确绑定Http状态码,响应默认都会带有500状态码。

当然,除了这些默认机制,我们也可以将自定义异常绑定特点的Http状态码,通过@ResponseStatus注解可实现,如下示例:

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

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

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

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

控制器中的异常处理方法(@ExceptionHandler)

异常处理方法能处理同一个controller中所有方法抛出的异常,如下示例:

我们在controller下添加了一个MyException异常的处理方法,直接返回到body。

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

打开浏览器,观察结果:

控制器通知(@ControllerAdvice)

异常处理方法只能处理同一个controller中抛出的异常,然而一个系统,肯定不止一个controller,总不可能在每个controller中都添加重复性的异常处理方法吧~~

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

带有@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);
} }

有一个点注意下,就是spring 扫描配置的时候,要包括该bean,我的配置如下,可参考:

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方法。

参考资料

spring in action 4

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

  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. SI与EMI(一) - 反射是怎样影响EMI

    Mark为期两天的EMC培训中大概分成四个时间差不多的部分,简单来说分别是SI.PI.回流.屏蔽.而在信号完整性的书籍中,也会把信号完整性分为:1.信号自身传输的问题(反射,损耗):2.信号与信号之间 ...

  2. ★Kali信息收集~3.子域名系列

    ★3.1Netcraft :子域名查询  官网:http://searchdns.netcraft.com/ 输入要查询的域名,即可得知子域名 3.2Fierce :子域名查询 概述: fierce ...

  3. 前端学HTTP之网关、隧道和中继

    前面的话 Web是一种强大的内容发布工具.人们已经从只在网上发送静态的在线文档,发展到共享更复杂的资源,比如数据库内容或动态生成的HTML页面.Web浏览器为用户提供了一种统一的方式来访问因特网上的内 ...

  4. JQuery知识点总结

    一. 1.JavaScript是Netscape公司开发的一种脚本语言(scripting language).JavaScript的出现实现了使得网页和用户之间实时的,动态的和交互的关系,使网页包含 ...

  5. React.js深入学习详细解析

    今天,继续深入学习react.js. 目录: 一.JSX介绍 二.React组件生命周期详解 三.属性.状态的含义和用法 四.React中事件的用法 五.组件的协同使用 六.React中的双向绑定   ...

  6. Oracle 11g静默安装简明版

    环境:RHEL 6.5 + Oracle 11.2.0.4 1. 初步处理应答文件 2. 静默安装软件 3. 静默安装监听 4. 静默dbca建库 说明: 本文默认安装软件前的步骤已经设置完毕 如果没 ...

  7. u-boot源码汇编段简要分析

    Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ...

  8. 用eclipse开发项目时遇到的常见错误整理,和配套解决方案(1)

    01. MyEclipse项目导入eclipse后,怎么发布不了? 今天导入了之前的一个MyEclipse项目,更改jdk后,发现发布不了.解决方案如下: 打开项目根目录,找到.settings文件夹 ...

  9. ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态

    原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...

  10. 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新

    在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...