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内部实现更个性化点异常处 ...
随机推荐
- Mybatis实现原理探究-实现部分Mybatis功能(上)
一.前言: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简 ...
- 如何使用Java执行cmd命令
用JAVA代码实现执行CMD命令的方法! Runtime rt = Runtime.getRuntime(); Process p = rt.exec(String[] cmdarray); ...
- 如何将word中的图片和文字导入自己的博客中
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- hdu 5019
http://acm.hdu.edu.cn/showproblem.php?pid=5019 给出X 和Y,求出第K 大的 X 和Y 的公约数. 暴力求出所有公约数 #include <cstd ...
- Toad 实现 SQL 优化
It is very easy for us to implement sql tuning by toad. We need to do is just give complex sql stat ...
- Alwayson--问题总结二
1. 备份首选项作用 答:备份首选项并不影响实际的备份操作,只是在备份前提供标示当前副本是否是推荐的备份副本.管理员可以忽略备份首选项在任意副本上执行完整备份和日志备份. 2. 在辅助副本和主副本备份 ...
- 设计模式之迭代器模式(Iterator Pattern)
一.什么是迭代器模式? 用迭代器来封装集合对象的遍历细节,使调用者能够通过统一的接口来实现对集合的遍历 迭代器也给集合对象提供了一定的保护,想要遍历集合,直接调用迭代器的方法就好了,我们不知道也不必知 ...
- SQL Server 2016最值得关注的10大新特性
全程加密技术(Always Encrypted) 全程加密技术(Always Encrypted)支持在SQL Server中保持数据加密,只有调用SQL Server的应用才能访问加密数据.该功能支 ...
- 双缓冲队列解决WPF界面卡死
工作中的项目,CS客户端会通过MQ接收前端设备发送的信息,之前测试的时候,由于测试的数据不大,没有进行压力测试,软件可以正常工作,随着项目现场设备数量的增加,CS客户端从MQ中订阅的数据量不断增加,最 ...
- s11 day 102 python Linux环境安装 与路飞项目 微信平台接口
1.微信公众号平台沙箱环境地址 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 二.结算中心业务 结算中心: -购物车,删 ...