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 ...
随机推荐
- Tomcat应用中post方式传参数长度限制
Tomcat应用中post方式传参数长度限制 jsp页面上是没有限制的,但是在tomcat服务器上有限制,Tomcat 默认的post参数的最大大小为2M, 当超过时将会出错,可以配置maxPostS ...
- yii2安装
https://github.com/settings/tokens 设置token 在安装的时候 要复制进去 复制到安装命令中去
- [经验交流] 简单安装 centreon 3.2
centreon 是一个自动化监控平台,监控数据存储在 mysql 中,监控配置在UI中操作,方便且功能强大. 1. centreon 监控引擎 centreon 可以与 nagios 结合,使用 n ...
- c#读取快递100查询返回的JSON信息
{"message":"ok","nu":"1105016801203","companytype" ...
- MapReduce格式与类型
MapReduce Types MapReduce是一个简单的数据处理模型,map与reduce的输入和输出类型都为key-value形式的键值对. map: (K1, V1) → list(K2, ...
- str转unsigned int
用法 1 参数:参数类型为char, 十六进制字符串形式:0X××××××[NUT],十进制字符串形式:×××××××[NUT],字符串的最大长度为16,字符串结尾符必须为ascii码值0(NUT). ...
- 8. String to Integer (atoi)
题目: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ca ...
- Vs打包工程 错误: Unable to update the dependencies of the project (转)
Setup Project 错误: Unable to update the dependencies of the project 在VS2010中编译包含安装工程的解决方案提示错误:Unable ...
- display:none与visibility: hidden的区别
display:none和visibility: hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失. ...
- spring2.0包说明【转】
Spring压缩包目录说明 关键字: sring jar 1. Spring压缩包目录说明 aspectj目录下是在Spring框架下使用aspectj的源代码和测试程序文件. Aspectj是jav ...