Spring 4 官方文档学习(十一)Web MVC 框架之异常处理
1、HandlerExceptionResolver
Spring HandlerExceptionResolver的实现们会处理controller执行过程中发送的unexpected exceptions。
一个HandlerExceptionResolver类似于你这web.xml中定义的exception mappings。然而,它们提供了更具弹性的方式。例如,它们提供了抛出exception时正在执行的handler的信息。更多地,编码式处理exceptions给予你更多的选择,可以在request被forwarded到另一个URL之前进行合适的处理。
除了实现HandlerExceptionResolver接口(具体来说就是实现resolveException(Exception, Handler) 方法,返回一个ModelAndView )外,你还可以使用SimpleMappingExceptionResolver或者创建@ExceptionHandler methods。前者可以让你获取可能被抛出的任意exception的class name,并将其映射到一个view name。其功能等效于Servlet API中的exception mapping feature,但可以实现更细化的exceptions mappings (来自不同handlers)。@ExceptionHandler注解可被用于methods,会被调用来处理一个exception。 这种方法可以定义在@Controller内部,或者定义在@ControllerAdvice class内--这样会适用于很多@Controller classes。 后面会详述。
2、@ExceptionHandler
HandlerExceptionResolver接口和SimpleMappingExceptionResolver实现们允许你声明式地将Exceptions映射到特定的views -- 还可以在forward到这些views之前进行一些逻辑操作。然而,在某些情况下,特别是在依赖于@ResponseBody methods而不是view resolution时,直接设置response status、将error content写入response body更为方便。
你可以使用@ExceptionHandler methods来完成。 当在一个controller内部声明了这种方法后,这种方法就会被用于该controller(或任意子类)中@RequestMapping methods抛出的exceptions。你也可以在一个@ControllerAdvice class中定义一个@ExceptionHandler method,这种情况下I安,他会处理很多controllers的@RequestMapping methods抛出的异常。
下面是controller本地的@ExceptionHandler method:
@Controller
public class SimpleController { // @RequestMapping methods omitted ... @ExceptionHandler(IOException.class)
public ResponseEntity<String> handleIOException(IOException ex) {
// prepare responseEntity
return responseEntity;
} }
注意,@ExceptionHandler的value可以是Exception类型的数组。只要被抛出的异常匹配了该数组中的任意一个,该方法就会被调用。如果该注解的value没有被设置,那么异常类型就是方法的参数类型。
很像标准controller 的@RequestMapping methods,@ExceptionHandler methods的方法参数和返回值是很灵活的。 例如,在Servlet环境下可以使用HttpServletRequest,而在Porlet环境下可以使用PortletRequest。 返回类型可以是String -- 会被解释成view name,也可以是ModelAndView对象、ResponseEntity,或者使用@ResponseBody将返回值转成String并写入response stream。
3、处理标准的Spring MVC Exceptions
在处理一个请求时,Spring MVC 可能抛出大量异常。 SimpleMappingExceptionResolver 可以轻易地将任何异常按照需要映射到默认的error view。然而,当clients以自动方式解析响应时,你会希望设置特定的response status code。 这些状态码可以区分client error (4xx) 或 server error (5xx)。
DefaultHandlerExceptionResolver 会将Spring MVC exceptions 翻译成特定的error status codes。 MVC namespace、MVC Java config、还有DispatcherServlet(当不使用MVC namespace 或 Java config时)会默认注册该功能。
下面列出了一些由该resolver处理的exceptions和相应的status code。
| Exception | HTTP Status Code |
|---|---|
|
|
400 (Bad Request) |
|
|
500 (Internal Server Error) |
|
|
406 (Not Acceptable) |
|
|
415 (Unsupported Media Type) |
|
|
400 (Bad Request) |
|
|
500 (Internal Server Error) |
|
|
405 (Method Not Allowed) |
|
|
400 (Bad Request) |
|
|
500 (Internal Server Error) |
|
|
400 (Bad Request) |
|
|
400 (Bad Request) |
|
|
404 (Not Found) |
|
|
404 (Not Found) |
|
|
400 (Bad Request) |
DefaultHandlerExceptionResolver 会悄悄的工作:设置response的status code。然而,它没有将任何error content写入到response body 的功能-- 当你希望给每个error response添加一些开发者友好的内容时,它无能为力。这时,你可以准备一个ModelAndView,然后通过view resolution来render content -- 就是说,通过配置一个ContentNegotiatingViewResolver、MappingJackson2JsonView等等view resolution来完成。然而,你可能更倾向于使用@ExceptionHandler method。
如果你倾向于使用@ExceptionHandler methods来写入error content,你可以继承ResponseEntityExceptionHandler。这对于需要提供一个@ExceptionHandler method来处理标准的Spring MVC exceptions并返回ResponseEntity的@ControllerAdvice classes来说,是一个很方便的base。它可以允许你定制response,并通过message converter来写入error content。 详见其javadocs。
4、使用@ResponseStatus来注解业务异常 (Business Exceptions)
业务异常可以使用@ResponseStatus来注解。 当该异常被抛出时,ResponseStatusExceptionResolver会设置其response status。 DispatcherServlet默认注册了ResponseStatusExceptionResolver,所以直接可用。
5、定制Default Servlet Container Error page
当response status被设置成一个error status code,且response body为空时,Servlet Container通常会render一个HTML格式的error page。想要定制container默认的error page,你可以在web.xml中声明一个<error-page>元素。一直到Servlet 3 (不包含),该元素都是被映射到一个特定的status code或exception type。但从Servlet 3 开始,error page不需要被映射了,这意味着指定的位置会定制默认的Servlet Container error page。
<error-page>
<location>/error</location>
</error-page>
注意,该error page的实际位置可以是一个JSP page,或者container包含的其他URL -- 只要是通过一个@Controller method处理的URL即可:
当写入error information时,可以之一个controller中通过request attributes来访问HttpServletResponse中设置好的status code和error message:
@Controller
public class ErrorController { @RequestMapping(path = "/error", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public Map<String, Object> handle(HttpServletRequest request) { Map<String, Object> map = new HashMap<String, Object>();
map.put("status", request.getAttribute("javax.servlet.error.status_code"));
map.put("reason", request.getAttribute("javax.servlet.error.message")); return map;
} }
或者,在一个JSP中:
<%@ page contentType="application/json" pageEncoding="UTF-8"%>
{
status:<%=request.getAttribute("javax.servlet.error.status_code") %>,
reason:<%=request.getAttribute("javax.servlet.error.message") %>
}
Spring 4 官方文档学习(十一)Web MVC 框架之异常处理的更多相关文章
- Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC
内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...
- Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图
接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...
- Spring 4 官方文档学习(十一)Web MVC 框架
介绍Spring Web MVC 框架 Spring Web MVC的特性 其他MVC实现的可插拔性 DispatcherServlet 在WebApplicationContext中的特殊的bean ...
- Spring 4 官方文档学习(十二)View技术
关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...
- Spring Boot 官方文档学习(一)入门及使用
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
- Spring boot官方文档学习(一)
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)
接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion
本篇太乱,请移步: Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 写了删删了写,反复几次,对自己的描述很不 ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)
题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...
- Spring 4 官方文档学习(十一)Web MVC 框架之编码式Servlet容器初始化
在Servlet 3.0+ 环境中,你可以编码式配置Servlet容器,用来代替或者结合 web.xml文件.下面是注册DispatcherServlet : import org.springfra ...
随机推荐
- 互斥锁(Mutex)
互斥锁(Mutex)互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它.互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数://创建一个处于未获取状态的互斥锁Public ...
- 黄聪:详解 ManualResetEvent(转)
原文:http://www.cnblogs.com/li-peng/p/3291306.html 今天详细说一下ManualResetEvent 它可以通知一个或多个正在等待的线程已发生事件,允许线程 ...
- java中Date与String的相互转化
1:大体思路 这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: 也是最简单的方法 Date date=new Date("2008-04 ...
- DataTable与DataSet
转自:http://www.cnblogs.com/rjf1979/archive/2010/09/09/1822667.html DataSet包含很多个DataTable 一张表的时候用DataT ...
- JNI环境搭建,CDT, cygwin,NDK
1.为eclipse增加c和c++的开发插件 下载地址:http://www.eclipse.org/cdt/downloads.php 2,安装cygwin Ndk需要运行在linux环境下,cyg ...
- assembly打包。
--排除 <?xml version="1.0" encoding="UTF-8"?><assembly xmlns="htt ...
- 二十六:Struts2 和 spring整合
二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot-- ...
- C# 數據事務操作
public sealed class SQLFunc { #region Methods #region OpenConnection /// <summary>指定包含連接字串的字串 ...
- CentOS网络配置详解
转载于CentOS中文站:http://www.centoscn.com/CentOS/2015/0507/5376.html一.配置文件详解 在RHEL或者CentOS等Redhat系的Linux系 ...
- Windows程序设计(第五版)学习:第二章 Unicode简介
第二章 Unicode简介 1,Windows通过双字节技术DBCS解决这个问题,代码页定义不同的字符集,称为ANSI字符集,比如日文为CP932,韩文为CP949,繁体中文为CP950,简体中文为C ...