zoukankan      html  css  js  c++  java
  • SpringBoot入门系列(十一)统一异常处理的实现

    前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务和定时任务。不清楚的朋友可以看看之前的文章:《Spring Boot 入门系列文章

    接下来主要讲解如何在SpringBoot应用中使用统一异常处理。如何实现对异常数据与正常的业务数据统一以json形式返回?

    为什么要统一异常处理

    当前我们项目架构基本上都是前后端分离的模式,采用Restful接口形式协议开发,前台不管任何业务逻辑,只是接受现实数据。但是如果后台发生异常像数据库异常、权限问题、Redis缓存异常、业务处理错误等各种异常时,前端通常会显示一个非常难看的错误页面。这对于用户来说非常不友好,也影响业务的正常进行。所以我们需要对各种系统异常进行统一处理,然后返回我们想要的结果。

    如何实现

    Spring Boot 实现统一异常处理的方法主要有以下两种:

    第一种:使用@ControllerAdvice和@ExceptionHandler注解

    第二种:使用ErrorController类来实现。

    使用ErrorController的方式比较简单,这里就不介绍了。今天主要就讲讲如何使用@ControllerAdvice和@ExceptionHandler注解的方式实现统一异常处理。

    1.统一异常处理类

    package com.weiz.exception;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.weiz.utils.JSONResult;
    
    @ControllerAdvice
    public class GlobalExceptionHandler  {
    
        public static final String ERROR_VIEW = "error";
    
    
        @ExceptionHandler(value = Exception.class)
        public Object errorHandler(HttpServletRequest reqest, 
                HttpServletResponse response, Exception e) throws Exception {
            
            e.printStackTrace();
            // 是否ajax请求
            if (isAjax(reqest)) {
                return JSONResult.errorException(e.getMessage());
            } else {
                ModelAndView mav = new ModelAndView();
                mav.addObject("exception", e);
                mav.addObject("url", reqest.getRequestURL());
                mav.setViewName(ERROR_VIEW);
                return mav;
            }
        }
        
        public static boolean isAjax(HttpServletRequest httpRequest){
            return  (httpRequest.getHeader("X-Requested-With") != null  
                        && "XMLHttpRequest"
                            .equals( httpRequest.getHeader("X-Requested-With")) );
        }
    }

    说明:

      1、注解@ControllerAdvice表示这是一个控制器增强类,当控制器发生异常就会被此拦截器被拦截。

      2、注解@ExceptionHandler 定义拦截的异常类,可以获取抛出的异常信息。这里可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大。

    2. 错误页面

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8" />
        <title>捕获全局异常</title>
    </head>
    <body>
        <h1 style="color: red">发生错误:</h1>
        <div th:text="${url}"></div>
        <div th:text="${exception.message}"></div>
    </body>
    </html>

    说明:这里用的是thymeleaf 模板,这个之前介绍过:《SpringBoot入门系列(四)整合模板引擎Thymeleaf

    3. 测试类

    创建一个测试异常的controller

    package com.weiz.controller;
    
    import com.weiz.utils.JSONResult;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @RequestMapping("err")
    public class ErrorController {
    
        @RequestMapping("/error")
        public String error() {
            
            int a = 1 / 0;
            
            return "thymeleaf/error";
        }
        
        @RequestMapping("/ajaxerror")
        public String ajaxerror() {
            
            return "thymeleaf/ajaxerror";
        }
        
        @RequestMapping("/getAjaxerror")
        @ResponseBody
        public JSONResult getAjaxerror() {
            
            int a = 1 / 0;
            
            return JSONResult.ok();
        }
    }

    测试

    在浏览器中输入:http://localhost:8088/err/error

     最后

    以上,就把Spring Boot统一异常处理讲完了。这里只介绍了使用@ControllerAdvice注解实现异常处理的方法,还有ErrorController的实现方式,大家可以去了解。

    注解@ControllerAdvice方式只能处理控制器抛出的异常,而类ErrorController方式可以处理所有的异常,包括未进入控制器的错误,比如404,401等错误。

  • 相关阅读:
    Spring 中众多的的Initializer
    Spring Factories
    spring 的各种context
    @import和@Bean的区别,以及ImportSelector和ImportBeanDefinitionRegistrar两个接口的简单实用
    Spring 配置的方式
    记一次JAVA FULL GC问题处理【3】
    关于String, StringBuilder,StringBuffer 的一些测试数据
    记一次JAVA FULL GC问题处理【2】
    ThreadLocal 结构
    记一次JAVA FULL GC问题处理【1】
  • 原文地址:https://www.cnblogs.com/zhangweizhong/p/12600220.html
Copyright © 2011-2022 走看看