spring异常处理器
一、本篇文章旨在讨论异常处理器:
1、因为异常处理器在实战中通常用来处理开发人员自定义的运行时异常,所以如果要了解如何自定义运行时异常,请自行搜索相关资料。
2、本文的demo用IndexOutOfBoundsException来演示怎么处理希望处理的异常。(项目实战中,一般是一个开发人员自定义的异常)
二、进入主题:
我见到一些项目,通常在controller中加上try-catch模块,用来处理自定义异常和其它异常,并且打印日志。
此类try-catch代码就是样板代码:每个开发人员都要重复写一遍,既耗费时间,又容易在打印日志上犯一些错误。
是的,自定义异常处理器的一个目的,就是为了消除controller中的try-catch样板代码。它还有更多强大作用,例如参数处理。更多细节可以自行研究API。
本文将对自定义异常处理器做一个入门介绍。
三、代码:
spring中提供了两种不同的方案@ControllerAdvice和ExceptionResolver。
3.1 @ControllerAdvice
当任意一个Controller抛出一个IndexOutOfBoundsException异常时,会首先进入注册了@ControllerAdvice的处理器。
实现如下:
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import java.util.HashMap;
import java.util.Map; /**
* Created by baimq on 2017/5/1.
* spring3.2后支持该注解:ControllerAdvice
* 注册该bean,用以增强Controller的处理能力;
* 该bean中的注解ExceptionHandler用以增强Controller抛出的异常的处理能力。
*/
@ControllerAdvice
public class DemoEnhanceHandlerAdvice { //处理从任何一个Controller抛出的IndexOutOfBoundsException(自行指定处理何种异常)
@ExceptionHandler(IndexOutOfBoundsException.class)
public ModelAndView exception(Exception exception, WebRequest request) {
//Spring3.2是MappingJacksonJsonView,spring4是MappingJackson2JsonView
MappingJackson2JsonView jacksonJsonView = new MappingJackson2JsonView();
jacksonJsonView.setAttributesMap(createResultMap("901111", "越界错误"+exception.getMessage()));
return new ModelAndView(jacksonJsonView);//返回一个json
} protected Map<String, Object> createResultMap(String code, String message) {
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("code", code);
resultMap.put("message", message);
return resultMap;
} }
3.2 ExceptionResolver
如果未在ControllerAdvice注解中处理异常的话,IndexOutOfBoundsException会继续往上抛,在ExceptionResolver有另一次机会获得个性化的处理。
你可以继承org.springframework.web.servlet.HandlerExceptionResolver或者其它子类;
我选择使用了org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver作为demo。
**
* Created by baimq on 2017/5/1.
*/
@Component
public class DemoExceptionResolver extends AbstractHandlerExceptionResolver { @Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//Spring3.2是MappingJacksonJsonView,spring4是MappingJackson2JsonView
MappingJackson2JsonView jacksonJsonView = new MappingJackson2JsonView();
if(ex instanceof IndexOutOfBoundsException){
jacksonJsonView.setAttributesMap(createResultMap("901111", "越界错误:"+ex.getMessage()));
}else{
jacksonJsonView.setAttributesMap(createResultMap("901114", "未知错误:"+ex.getMessage()));
}
return new ModelAndView(jacksonJsonView);
} protected Map<String, Object> createResultMap(String code, String message) {
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("code", code);
resultMap.put("message", message);
return resultMap;
}
}
如spring有其它异常处理方案,请不吝赐教。
本文完。
spring异常处理器的更多相关文章
- spring设置全局异常处理器
1.spring设置全局异常,它的原理是向上捕获 spring.xml配置 <!--自定义全局异常处理器--> <bean id="globalExceptionResol ...
- Spring Boot 中全局异常处理器
Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloCon ...
- 【spring】-- springboot配置全局异常处理器
一.为什么要使用全局异常处理器? 什么是全局异常处理器? 就是把错误异常统一处理的方法. 应用场景: 1.当你使用jsr303参数校验器,如果参数校验不通过会抛异常,而且无法使用try-catch语句 ...
- 012医疗项目-模块一:统一异常处理器的设计思路及其实现(涉及到了Springmvc的异常处理流程)
我们上一篇文章是建立了一个自定义的异常类,来代替了原始的Exception类.在Serice层抛出异常,然后要在Action层捕获这个异常,这样的话在每个Action中都要有try{}catch{}代 ...
- spring 异常管理机制
三.异常处理的几种实现: 3.1.在经典的三层架构模型中,通常都是这样来进行异常处理的: A.持久层一般抛出的是RuntiomeException类型的异常,一般不处理,直接向上抛出. B.业务层一般 ...
- 程序员笔记|常见的Spring异常分析及处理
一.前言 相信我们每个人在SpringMVC开发中,都遇到这样的问题:当我们的代码正常运行时,返回的数据是我们预期格式,比如json或xml形式,但是一旦出现了异常(比如:NPE或者数组越界等等),返 ...
- 基于SpringMVC的全局异常处理器介绍(转)
近几天又温习了一下SpringMVC的运行机制以及原理 我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)层,常用的注解有@Controller.@RequestM ...
- SpringMVC实现全局异常处理器 (转)
出处: SpringMVC实现全局异常处理器 我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手 ...
- 从源码看全局异常处理器@ExceptionHandler&@ExceptionHandler的生效原理
1.开头在前 日常开发中,几乎我们的项目都会用到异常处理器,我们通常会定制属于自己的异常处理器,来处理项目中大大小小.各种各样的异常.配置异常处理器目前最常用的方式应该是使用@ControllerAd ...
随机推荐
- win10 如何配置 java jdk1.8环境变量(2017.2.24)
win10 如何配置 java jdk 环境变量 这里的win10 为全新安装的系统 一.安装 下载 jdk 64位 windows 版本安装(默认安装) 默认安装的路径: C:\Program Fi ...
- linux常用操作命令
cd: cd /data 进入目录 cd .. 返回上级菜单tar: tar -cvf jcms20170411.tar.gz jcms/ 将jcms文件夹打包为 jcms20170411.tar.g ...
- socket.io的编程实现
socket.io实例 一.环境要求 客户端需要引用socket.io.js文件 服务端需要按照node环境,以及npm install socket.io用来安装服务端的socket.io 二.客户 ...
- selenium结合docker构建分布式测试环境
selenium是目前web和app自动化测试的主要框架.对于web自动化测试而言,由于selenium2.0以后socker服务器由本地浏览器自己启动且直接通过浏览器原生API操作页面,故越来越多的 ...
- zepto.js介绍
是一个阉割版的jQuery zepto不支持jQuery过于复杂的选择器,比如:first :last :eq zepto如果要用动画必须再次引包 zepto能将css3中transition支持的动 ...
- HTML和CSS的知识点
HTML的知识点 HTML的结构: <!DOCTYPE html>: 文档类型性为HTML5文件 文档声明:在HTML的文档中必不可少,且必须在文档的第一行 文档声明的编码格式<!- ...
- SecureCRT中vim乱码问题
Options->Session Options,接着在Terminal->Appearance页签中设定Character encoding为Unicode (UTF-8).
- MAC系统操作指令汇总
OSX 的文件系统 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念. 你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做 US ...
- 深入浅出Node.js(一):什么是Node.js(转贴)
以下内容转自:http://www.infoq.com/cn/articles/what-is-nodejs/ 作者:崔康 [编者按]:Node.js从2009年诞生至今,已经发展了两年有余,其成长的 ...
- Java IO最详解
初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见 ...