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. Java实现浏览器端大文件分片上传

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  2. day14(xml 编写及解析)

    编写 xml的组成: 1.文档的声明 <?xml version='1.0' encoding='UTF-8' standalone='yes'> xml 表示标签的名字 encoding ...

  3. 20155202 2016-2017-2 《Java程序设计》第6周学习总结

    20155202 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 输入输出 数据从来源取出:输入串流 java.io.InputStream 写入目的的:输出 ...

  4. Resharper 修改命名空间

    1. 使用Reshared 右键->Refactor->Rename 修改所有文件的命名空间(鼠标移动到对应类的命名空间) 2.修改类库中的命名空间 包括程序集信息 右键->属性 3 ...

  5. PAT甲 1041. Be Unique (20) 2016-09-09 23:14 33人阅读 评论(0) 收藏

    1041. Be Unique (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Being uniqu ...

  6. mysql的sql性能分析器

    MySQL 的SQL性能分析器主要用途是显示SQL执行的整个过程中各项资源的使用情况.分析器可以更好的展示出不良SQL的性能问题所在. mysql sql profile的使用方法 1.开启mysql ...

  7. Discoverer Table

    http://www.cnblogs.com/fandychen/p/3182826.html EUL4_BAS Table gives list of Business Areas EUL4_OBJ ...

  8. NGINX部署

  9. FFMpeg音频重采样和视频格式转

    一.视频像素和尺寸转换函数 1.sws_getContext : 像素格式上下文  --------------->多副图像(多路视频)进行转换同时显示 2.struct SwsContext  ...

  10. pandas 对dataframe一列中某些值进行处理

    https://github.com/Bifzivkar/Boutique-Travel-Services-Predict/blob/master/feature/5_extract_feature. ...