zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Go-day01
    M1-Flask-Day2
    M1-Flask-Day1
    Tornado基于MiddleWare做中间件
    SqlAlchenmy基本使用
    PV、UV、UIP、VV、CPC、CPM、RPM、CTR解释
    Celery笔记
    Celery 分布式任务队列快速入门
    库操作
    Django cache
  • 原文地址:https://www.cnblogs.com/happyflyingpig/p/8398047.html
Copyright © 2011-2022 走看看