• 需求

    在构建RestFul的今天,我们一般会限定好返回数据的格式比如:

    {

    "code": 0,
      "data": {},
      "msg": "操作成功"

    }

    但有时却往往会产生一些bug。这时候就破坏了返回数据的一致性,导致调用者无法解析。所以我们常常会定义一个全局的异常拦截器。

    注意:ControllerAdvice注解 只拦截Controller 不回拦截 Interceptor的异常

  • 介绍

    在spring 3.2中,新增了@ControllerAdvice 注解,用于拦截全局的Controller的异常,注意:ControllerAdvice注解只拦截Controller不会拦截Interceptor的异常

  • 代码

    package com.cmc.schedule.handler;
    
    import com.gionee.base.entity.JsonResult;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.ConversionNotSupportedException;
    import org.springframework.beans.TypeMismatchException;
    import org.springframework.http.converter.HttpMessageNotReadableException;
    import org.springframework.http.converter.HttpMessageNotWritableException;
    import org.springframework.web.HttpMediaTypeNotAcceptableException;
    import org.springframework.web.HttpRequestMethodNotSupportedException;
    import org.springframework.web.bind.MissingServletRequestParameterException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.io.IOException;
    
    /**
     * 异常拦截处理器
     *
     * @author chenmc
     */
    @ControllerAdvice
    @ResponseBody
    public class GlobalExceptionHandler {
    
        private static final String logExceptionFormat = "Capture Exception By GlobalExceptionHandler: Code: %s Detail: %s";
        private static Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    
        //运行时异常
        @ExceptionHandler(RuntimeException.class)
        public String runtimeExceptionHandler(RuntimeException ex) {
            return resultFormat(1, ex);
        }
    
        //空指针异常
        @ExceptionHandler(NullPointerException.class)
        public String nullPointerExceptionHandler(NullPointerException ex) {
            return resultFormat(2, ex);
        }
    
        //类型转换异常
        @ExceptionHandler(ClassCastException.class)
        public String classCastExceptionHandler(ClassCastException ex) {
            return resultFormat(3, ex);
        }
    
        //IO异常
        @ExceptionHandler(IOException.class)
        public String iOExceptionHandler(IOException ex) {
            return resultFormat(4, ex);
        }
    
        //未知方法异常
        @ExceptionHandler(NoSuchMethodException.class)
        public String noSuchMethodExceptionHandler(NoSuchMethodException ex) {
            return resultFormat(5, ex);
        }
    
        //数组越界异常
        @ExceptionHandler(IndexOutOfBoundsException.class)
        public String indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException ex) {
            return resultFormat(6, ex);
        }
    
        //400错误
        @ExceptionHandler({HttpMessageNotReadableException.class})
        public String requestNotReadable(HttpMessageNotReadableException ex) {
            System.out.println("400..requestNotReadable");
            return resultFormat(7, ex);
        }
    
        //400错误
        @ExceptionHandler({TypeMismatchException.class})
        public String requestTypeMismatch(TypeMismatchException ex) {
            System.out.println("400..TypeMismatchException");
            return resultFormat(8, ex);
        }
    
        //400错误
        @ExceptionHandler({MissingServletRequestParameterException.class})
        public String requestMissingServletRequest(MissingServletRequestParameterException ex) {
            System.out.println("400..MissingServletRequest");
            return resultFormat(9, ex);
        }
    
        //405错误
        @ExceptionHandler({HttpRequestMethodNotSupportedException.class})
        public String request405(HttpRequestMethodNotSupportedException ex) {
            return resultFormat(10, ex);
        }
    
        //406错误
        @ExceptionHandler({HttpMediaTypeNotAcceptableException.class})
        public String request406(HttpMediaTypeNotAcceptableException ex) {
            System.out.println("406...");
            return resultFormat(11, ex);
        }
    
        //500错误
        @ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class})
        public String server500(RuntimeException ex) {
            System.out.println("500...");
            return resultFormat(12, ex);
        }
    
        //栈溢出
        @ExceptionHandler({StackOverflowError.class})
        public String requestStackOverflow(StackOverflowError ex) {
            return resultFormat(13, ex);
        }
    
        //其他错误
        @ExceptionHandler({Exception.class})
        public String exception(Exception ex) {
            return resultFormat(14, ex);
        }
    
        private <T extends Throwable> String resultFormat(Integer code, T ex) {
            ex.printStackTrace();
            log.error(String.format(logExceptionFormat, code, ex.getMessage()));
            return JsonResult.failed(code, ex.getMessage());
        }
    
    }  
    package com.cmc.base.entity;
    
    import com.alibaba.fastjson.JSON;
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author chenmc
     * @date 2017/10/12 17:18
     */
    @Data
    public class JsonResult implements Serializable{
    
        private int code;   //返回码 非0即失败
        private String msg; //消息提示
        private Map<String, Object> data; //返回的数据
    
        public JsonResult(){};
    
        public JsonResult(int code, String msg, Map<String, Object> data) {
            this.code = code;
            this.msg = msg;
            this.data = data;
        }
    
        public static String success() {
            return success(new HashMap<>(0));
        }
        public static String success(Map<String, Object> data) {
            return JSON.toJSONString(new JsonResult(0, "解析成功", data));
        }
    
        public static String failed() {
            return failed("解析失败");
        }
        public static String failed(String msg) {
            return failed(-1, msg);
        }
        public static String failed(int code, String msg) {
            return JSON.toJSONString(new JsonResult(code, msg, new HashMap<>(0)));
        }
    
    }
    

    Spring Boot这样就可以了,如果是没用Spring Boot的话,需要在SpringMvc的配置文件中增加下面的配置

    <!-- 处理异常 -->
        <context:component-scan base-package="com.gionee.xo" use-default-filters="false">
    	    <!-- base-package 如果多个,用“,”分隔 -->
    	    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    	    <!--控制器增强,使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常-->
    	    <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
    	</context:component-scan>

Spring Boot @ControllerAdvice 处理全局异常,返回固定格式Json的更多相关文章

  1. 只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

    ## 统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生. 比较通用的返回值格式如下: ```jav ...

  2. 在Spring Boot中添加全局异常捕捉提示

    在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 全局异常捕捉: 新建一个类GlobalDefaultExceptionHandler, 在class注解上@Controll ...

  3. Spring Boot自定义Redis缓存配置,保存value格式JSON字符串

    Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...

  4. Spring Cloud Gateway过滤器精确控制异常返回(实战,完全定制返回body)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 Spring Cloud Gateway应用 ...

  5. Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理

    在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...

  6. Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<Spring Cloud Gat ...

  7. spring boot / cloud (十二) 异常统一处理进阶

    spring boot / cloud (十二) 异常统一处理进阶 前言 在spring boot / cloud (二) 规范响应格式以及统一异常处理这篇博客中已经提到了使用@ExceptionHa ...

  8. Spring Boot @ControllerAdvice+@ExceptionHandler处理controller异常

    需求: 1.spring boot 项目restful 风格统一放回json 2.不在controller写try catch代码块简洁controller层 3.对异常做统一处理,同时处理@Vali ...

  9. spring boot如何处理异步请求异常

    springboot自定义错误页面 原创 2017年05月19日 13:26:46 标签: spring-boot   方法一:Spring Boot 将所有的错误默认映射到/error, 实现Err ...

随机推荐

  1. GCJ-02火星坐标系和WGS-84坐标系转换关系

    GCJ-02火星坐标系和WGS-84坐标系转换关系 WGS-84:GPS坐标系 GCJ-02:火星坐标系,国测局02年发布的坐标体系,高德,腾讯等使用. BD-09:百度坐标系,百度自研,百度地图使用 ...

  2. Netty5服务端源码解析

    Netty5源码解析 今天让我来总结下netty5的服务端代码. 服务端(ServerBootstrap) 示例代码如下: import io.netty.bootstrap.ServerBootst ...

  3. Windows下python2与python3兼容设置

    分别安装python2与python3后,我想直接通过命令python2.pip2与python3.pip3区分: 分别进入python安装目录下,修改python.exe为python2.exe.p ...

  4. python tesserocr ImportError: dll loading failed 一个不常遇见的错误,以及简单的python安装方法~

    废话不多说了,这是写给小白的了. 本人有c#,c/c++开发经验,最近因为偶然的原因,开始接触python,遇到一个棘手的问题,一位朋友在安装tesserocr 包后遇到一个错误,重新安装数次不能解决 ...

  5. python vs vscode问题汇总

    最近在学工程目录章节的时候遭遇了个把 vscode目录管理 造成的问题, 当然第一大原因是: 初学者使用vscode的时候没有将环境设置好..... 闹了好几天的脾气, 这两天才整理好..... 这事 ...

  6. webpack问题列表及解决方案

    1.提升webpack打包速度 2.cssloader顺序有先后 3.如何正确引用图片 4.打包后访问不到json文件 5.打包后如何访问项目 6.打包后的文件 7.为什么执行webpack,就可以打 ...

  7. UIImagePickerController照片选取器

    记录于2013/7/4   加入框架:  MobileCoreServices.framework  MediaPlayer.framework   导入头文件: #import <MediaP ...

  8. 动态规划——Freedom Trail

    题目:https://leetcode.com/problems/freedom-trail/ 额...不解释大意了,题目我也不想写过程了有点繁琐,直接给出代码: public int findRot ...

  9. markdown 书写文档的框架

    请使用 [MkDocs](http://www.mkdocs.org/)

  10. Do-Now—团队冲刺博客一(领航篇)

    Do Now -- 团队冲刺博客一(领航篇) 团队博客总目录:团队作业第一周 团队作业第二周 Do Now -- 团队冲刺博客一 领航目标 ① 各个成员在 Alpha 阶段认领的任务 ② 明日各个成员 ...