Spring统一异常处理
1、为什么要用Spring的统一异常处理?
项目中无论是controller层、service层还是dao层都会有异常发生。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。所以将异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护
2、Spring统一异常处理的方式有哪些?
2.1 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver。
2.2 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器。
2.3 使用@ExceptionHandler注解实现异常处理
3、做实验
3.1使用SimpleMappingExceptionResolver
3.1.1 在spring的配置文件applicationContext.xml文件中配置SimpleMappingExceptionResolver
<!-- springmvc提供的简单异常处理器 -->
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面,这里的error表示的是error.jsp页面-->
<property name="defaultErrorView" value="error" />
<!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception-->
<property name="exceptionAttribute" value="ex" />
<!-- 定义需要特殊处理的异常,这是重要点 -->
<property name="exceptionMappings">
<props>
<!-- 这里的exception表示的是exception.jsp页面 -->
<prop key="org.hope.lee.exception.UserException">exception</prop>
<prop key="org.hope.lee.exception.CustomerException">customerException</prop>
</props>
<!-- 还可以定义其他的自定义异常 -->
</property>
</bean>
3.1.2定义自己的异常
package org.hope.lee.exception;
public class UserException extends Exception{
private static final long serialVersionUID = 1L;
private String errorMsg;
public UserException(String errorMsg) {
super();
this.errorMsg = errorMsg;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
package org.hope.lee.exception;
public class CustomerException extends RuntimeException{
private String errorException;
public CustomerException(String errorException) {
super();
this.errorException = errorException;
}
public String getErrorException() {
return errorException;
}
public void setErrorException(String errorException) {
this.errorException = errorException;
}
}
3.1.3 写几个简单的页面error.jsp exception.jsp customerException.jsp
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
sorry, your request has some errors
</body>
</html>
exception.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
sorry, your request has ${ex.errorMsg}
</body>
</htm
customerException.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
sorry, your request has customerException:${ex.errorException}
</body>
</html>
3.1.4 Controller层
package org.hope.lee.controller; import org.hope.lee.exception.CustomerException;
import org.hope.lee.exception.UserException;
import org.hope.lee.model.User;
import org.hope.lee.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; @Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService; @RequestMapping("/index")
public String index() {
return "userDetail";
} @RequestMapping("/detail")
public ModelAndView detail(String id) throws UserException { if("0".equals(id)) {
throw new UserException("id不能为0");
} if("10".equals(id)) {
throw new CustomerException("id不能为10");
} User user = userService.findUserById(Integer.parseInt(id));
ModelAndView mv = new ModelAndView();
mv.addObject("user", user);
mv.setViewName("success");
return mv;
}
}
3.1.4 进行测试
①启动项目
②浏览器输入:http://localhost:8088/springmvc-exception/user/detail?id=1(这个是正常时候)

③浏览器输入:http://localhost:8088/springmvc-exception/user/detail?id=0

④浏览器输入:http://localhost:8088/springmvc-exception/user/detail?id=10

3.2自定义全局异常处理。
3.2.1 定义自己的异常处理类实现HandlerExceptionResolver
package org.hope.lee.exception; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView; /**
* 定义全局异常处理器
*/
public class ExceptionResolver implements HandlerExceptionResolver{ @Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView mav = new ModelAndView();
if(ex instanceof UserException) {
UserException ue = (UserException)ex;
mav.addObject("ex", ue);
mav.setViewName("exception");
} else if(ex instanceof CustomerException) {
CustomerException ce = (CustomerException)ex;
mav.addObject("ex", ce);
mav.setViewName("customerException");
} else {
mav.addObject("ex", "未知错误");
mav.setViewName("error");
} return mav;
} }
3.2.2 在applicationContext.xml中配置异常处理器
<bean class="org.hope.lee.exception.ExceptionResolver"/>
3.3 使用@ExceptionHandler
3.3.1 定义一个BaseController,所有的Controller层都要继承它
package org.hope.lee.controller; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.hope.lee.exception.CustomerException;
import org.hope.lee.exception.UserException;
import org.springframework.web.bind.annotation.ExceptionHandler; public class BaseController { @ExceptionHandler
public String exp(HttpServletRequest req, HttpServletResponse resp, Exception ex) {
req.setAttribute("ex", ex); if(ex instanceof UserException) {
return "exception";
} else if(ex instanceof CustomerException) {
return "customerException";
} else {
return "error";
}
}
}
3.3.2 定义一个Controller,继承BaseController
package org.hope.lee.controller; import org.hope.lee.service.SellerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class SellerController extends BaseController{
@Autowired
private SellerService sellerService; @RequestMapping("/good/update")
public void updateGood(String id) {
sellerService.updateGoodsById(Integer.parseInt(id));
}
}
3.3.3 测试一下,启动项目在浏览器访问:http://localhost:8088/springmvc-exception/good/update?id=0

https://gitee.com/huayicompany/spring-learn/tree/master/springmvc-exception
参考:
[1] 博客,http://blog.csdn.net/eson_15/article/details/51731567
[2] 博客,http://luanxiyuan.iteye.com/blog/2354081
Spring统一异常处理的更多相关文章
- 使用Spring MVC统一异常处理实战
1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合 ...
- Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志
在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义 ...
- Spring MVC 统一异常处理
Spring MVC 统一异常处理 看到 Exception 这个单词都心慌 如果有一天你发现好久没有看到Exception这个单词了,那你会不会想念她?我是不会的.她如女孩一样的令人心动又心慌,又或 ...
- spring boot / cloud (二) 规范响应格式以及统一异常处理
spring boot / cloud (二) 规范响应格式以及统一异常处理 前言 为什么规范响应格式? 我认为,采用预先约定好的数据格式,将返回数据(无论是正常的还是异常的)规范起来,有助于提高团队 ...
- Spring Boot统一异常处理实践
摘要: SpringBoot异常处理. 原文:Spring MVC/Boot 统一异常处理最佳实践 作者:赵俊 前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是一件棘手的事情, 对于很多 ...
- Spring Boot中Web应用的统一异常处理
我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来 ...
- spring boot配置统一异常处理
基于@ControllerAdvice的统一异常处理 >.这里ServerException是我自定义的异常,和普通Exception分开处理 >.这里的RequestResult是我自定 ...
- 基于spring boot的统一异常处理
一.springboot的默认异常处理 Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容. 例如这里我 ...
- Spring MVC统一异常处理
实际上Spring MVC处理异常有3种方式: (1)一种是在Controller类内部使用@ExceptionHandler使用注解实现异常处理: 可以在Controller内部实现更个性化点异常处 ...
随机推荐
- webuploader在ie7下的flash模式的使用
webuploader在ie7下不能使用h5模式上传图片,只能使用flash模式. 但是出现了几个问题:(1)必须正确的引入.swf文件,才能使webuploader正常运行 ...
- (矩阵快速幂) Fibonacci -- poj -- 3070
链接: http://poj.org/problem?id=3070 Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- hdu 4996 1~n排列LIS值为k个数
http://acm.hdu.edu.cn/showproblem.php?pid=4996 直接贴bc题解 按数字1-N的顺序依次枚举添加的数字,用2N的状态保存在那个min数组中的数字,每次新添加 ...
- eclipse 安装
做一个项目,需要搭建环境.使用sql server 2005,tomcat,eclipse.过程真复杂,碰到些小问题,不过都解决了,还算顺利. win7下sql server 2005安装:http: ...
- iOS 5 故事板进阶(2)
让我们回到游戏排行窗口Ranking.创建一个 UITableViewController子类,命名为 RankingViewController. 编辑 RankingViewController. ...
- Nodejs-- web服务器
第一篇关于nodejs的东西,代码在此作为备份. 该代码目前未完成,是一个阻塞式的代码. 1.index.js ar server=require('./server'); var route=req ...
- Django:form.save()方法
参考:https://blog.csdn.net/it_yuan/article/details/53580756 背景: 之前的博客是不支持上传文章缩略图的,后来新增了此功能,但是发现修改老的文章时 ...
- asp.net—单例模式
一.单例模式是什么? 定义:确保一个类仅仅能产生一个实例,并且提供一个全局访问点来获取该实例. 二.单例模式怎么用? class SingleCase { public string Name{get ...
- UWP开发---嵌套DataTemplate&模板选择器
对于Json结构体items不完全一致的情况下,在UWP平台是如何处理数据,并通过不同的模板选择,进行显示呢? 一,嵌套Json分析 1,结构 通过抓取index的API(点击请求API)获取到的js ...
- Handler主线程和子线程相通信
//创建主线程的handlerprivate Handler handler = new Handler(){ @Override public void handleMessage(Message ...