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统一异常处理的更多相关文章

  1. 使用Spring MVC统一异常处理实战

    1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合 ...

  2. Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志

    在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义 ...

  3. Spring MVC 统一异常处理

    Spring MVC 统一异常处理 看到 Exception 这个单词都心慌 如果有一天你发现好久没有看到Exception这个单词了,那你会不会想念她?我是不会的.她如女孩一样的令人心动又心慌,又或 ...

  4. spring boot / cloud (二) 规范响应格式以及统一异常处理

    spring boot / cloud (二) 规范响应格式以及统一异常处理 前言 为什么规范响应格式? 我认为,采用预先约定好的数据格式,将返回数据(无论是正常的还是异常的)规范起来,有助于提高团队 ...

  5. Spring Boot统一异常处理实践

    摘要: SpringBoot异常处理. 原文:Spring MVC/Boot 统一异常处理最佳实践 作者:赵俊 前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是一件棘手的事情, 对于很多 ...

  6. Spring Boot中Web应用的统一异常处理

    我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来 ...

  7. spring boot配置统一异常处理

    基于@ControllerAdvice的统一异常处理 >.这里ServerException是我自定义的异常,和普通Exception分开处理 >.这里的RequestResult是我自定 ...

  8. 基于spring boot的统一异常处理

    一.springboot的默认异常处理 Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容. 例如这里我 ...

  9. Spring MVC统一异常处理

    实际上Spring MVC处理异常有3种方式: (1)一种是在Controller类内部使用@ExceptionHandler使用注解实现异常处理: 可以在Controller内部实现更个性化点异常处 ...

随机推荐

  1. HDU 4355 Party All the Time (三分求极值)

    题意:给定x轴上有n个点,每一个点都有一个权值,让在x轴上选一个点,求出各点到这个点的距离的三次方乘以权值最小. 析:首先一开始我根本不会三分,也并没有看出来这是一个三分的题目的,学长说这是一个三分的 ...

  2. 深入浅析JavaScript中with语句的理解

    JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象. with语句的作用是暂时改变 ...

  3. Java_得到GET和POST请求URL和参数列表

    一. 获取URL: getRequestURL()(还有个getRequestURI(),只取后面部分) 二. 获取参数列表: 1.getQueryString() 只适用于GET,比如客户端发送ht ...

  4. 6.<1>四则运算的研究[栈]

    计算1+2*3=,这个程序还是比较绕的,先将程序简化,只做+-*/和=五个运算符的关系.首先,假定这五个运算符中,=号的优先级最低,其次是+-,最高为*/.接着约定,"1+2*3=" ...

  5. bootstrap modal

    模态框提供了两个可选尺寸,通过为 .modal-dialog 增加一个样式调整类实现.加modal-lg,加modal-sm,不加也可以,共有三种尺寸. 触发方式,data-target, 感觉比js ...

  6. [program]编程习惯总结(2015_11_25)

    1. 前端页面不要的数据,那么后端就不要发送到前端: 如:我们根据各个大洲来建立了一个个大洲的讨论区,但是在发表讨论页面.我们却希望用户去选择与当前帖子相关的国家标签. 那么,我们只需要在后台使用国家 ...

  7. 【WinRT】让控件飞,WinRT 中实现 web 中的 dragable 效果

    由于在 xaml 体系中,控件没有传统 WebForm 中的 Left.Top.Right.Bottom 这些属性,取而代之的是按比例(像 Grid)等等的响应布局.但是,传统的这些设置 Left.T ...

  8. linux系统编程之信号(四):alarm和可重入函数

    一,alarm() 在将可重入函数之前我们先来了解下alarm()函数使用: #include <unistd.h> unsigned int alarm(unsigned int sec ...

  9. WebAPI Token 验证

    WebAPI Token 验证 登录端 //HttpContext.Current.Session.Timeout = 10; ////生成Ticket //FormsAuthenticationTi ...

  10. 窗口与导航-----Selenium快速入门(十三)

    前面所讲的,大部分是WebDriver这个接口以及相关的类的使用.而本文所讲的窗口与导航,也是里面的内容,而且非常简单,目测就能学会. 一.窗口,也就是window,这里的窗口是指浏览器窗口.他的方法 ...