springboot 统一错误处理

方式一 : 继承BasicErrorController

1. 创建配置类

import com.imooc.manager.error.MyErrorController;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * 错误处理相关配置
 */
@Configuration
public class ErrorConfiguration {

    @Bean
    public MyErrorController basicErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties,
                                                  ObjectProvider<List<ErrorViewResolver>> errorViewResolversProvider) {
        return new MyErrorController(errorAttributes, serverProperties.getError(),errorViewResolversProvider.getIfAvailable());
    }

}

2. 创建自定义处理类 并继承BasicErrorController

import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
import org.springframework.boot.web.servlet.error.ErrorAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * 自定义错误处理controller
 */
public class MyErrorController extends BasicErrorController {

    public MyErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties, List<ErrorViewResolver> errorViewResolvers) {
        super(errorAttributes, errorProperties, errorViewResolvers);
    }

    /*
    springboot默认返回的错处信息
    {
    "timestamp": "2018-08-23 20:33:12",
    "status": 500,
    "error": "Internal Server Error",
    "message": "编号不可为空",
    "path": "/manager/products",
    }
    */

    //getErrorAttributes 方法可以获取,或者设置这些内容
    @Override
    protected Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) {
        Map<String, Object> attrMap = super.getErrorAttributes(request, includeStackTrace);
        //去除掉默认返回的错误信息
        attrMap.remove("timestamp");
        attrMap.remove("status");
        attrMap.remove("error");
        attrMap.remove("exception");
        attrMap.remove("path");
        //返回自定义的错误信息
        String errorCode = (String) attrMap.get("message");
        ErrorEnum errorEnum = ErrorEnum.getByCode(errorCode);
        attrMap.put("message",errorEnum.getMessage());
        attrMap.put("code",errorEnum.getCode());
        attrMap.put("canRetry",errorEnum.isCanRetry());
        return attrMap;
    }
}

方式二:使用注解@ControllerAdvice

1. 创建自定类 添加注解

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

/**
 * 统一错误处理
 */
@RestControllerAdvice(basePackages = {"com.acc.manager.controller"})
public class ErrorControllerAdvice {

    @ExceptionHandler(Exception.class)
    public ResponseEntity handleException(Exception e){
        Map<String, Object> attrMap = new HashMap<>();
        String errorCode = e.getMessage();
        ErrorEnum errorEnum = ErrorEnum.getByCode(errorCode);
        attrMap.put("message",errorEnum.getMessage());
        attrMap.put("code",errorEnum.getCode());
        attrMap.put("canRetry",errorEnum.isCanRetry());
        attrMap.put("type","advice");
        return new ResponseEntity(attrMap, HttpStatus.INTERNAL_SERVER_ERROR);
    }

}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,268评论 6 342
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,939评论 1 92
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,545评论 19 139
  • 接近一个月的窜课 单休 让本来身体就不好 每天还接近上六七节课的孙岩老师直接失声了。一直以来,支撑着我们的那...
    都安先生阅读 1,424评论 0 2
  • 实习已经开始两个月了,在实习的前一天,我告诉自己,上班了以后一定要好好工作,积极向上,可是,在两个月后的今天,我是...
    小丑鱼_1a91阅读 243评论 0 0

友情链接更多精彩内容