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内部实现更个性化点异常处 ...
随机推荐
- Quartus调用MOdelsim仿真过程
quarutsii调用modelsim实际是相对比较简单的.因为不需要选择要编译的库. 调用前的设置:设置调用的工具,也就是下面的Tool name,选择仿真语言,在这里选择为Verilog HDL, ...
- day4之装饰器进阶、生成器迭代器
装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...
- MySQL-5.7.10主主同步的安装和配置
目录 目录 1 1. 安装 1 2. 修改MySQL的root密码 4 3. mysqld_safe和mysql.server 4 4. 主主同步配置 4 4.1. 创建同步用户 4 4.2. my. ...
- iOS平台设置系统状态栏(通知栏、顶部状态栏)样式背景颜色或透明
5+App开发 状态栏 配置系统状态栏样式 iOS平台可支持对系统状态栏样式的配置,在应用manifest.json文件的plus->distribute->apple下添加UIStatu ...
- DIN-A4 doublesided year calendar
% DIN-A4 doublesided year calendar % Author: Robert Krause % License : Creative Commons attribution ...
- 20181015记录一个简单的TXT日志类
20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...
- 蚂蚁男孩.缓存组件(Framework.Mayiboy.Caching)
它能做什么? 主要是用来方便使用缓存而诞生,该组件封装了RunTimeCache.Memcached.Redis的使用,通过简单配置就能高效快速使用起来. 使用说明 一. 下载源码,自己手动编译 ...
- Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'img' at row 1故障
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'img' at ro ...
- 记一次生产发版时SpringBoot服务停用启用的问题
近期项目交接,接手了个SpringBoot项目.生产环境里,jar包是通过软链接做成linux服务来启动和停用. 然而,每次通过jenkins构建发版,项目构建完毕,还要手动再去重启服务. 听交接的同 ...
- 深度优先搜索 - 简单demo
输入一个数n,输出 1 ~ n 的全排列,例如输入 3,全排列则为:123,132,213,231,312,321 一共六种. 这里采用深度优先搜索来解决这个问题: #include<stdio ...