SpringBoot入门二十一,全局异常处理

一共两个文件,一个处理全局异常,保存信息到日志,另外一个负责返回异常信息给接口,只要将其文件添加到项目中,无需再做其他配置即可

1. MyExceptionHandler.java 全局异常处理类

优先执行此类,这里不好抓取404、403等错误信息
getMaps()请参考获取request中传递过来的参数信息
getHeaders()请参考获取request中传递过来的header信息
代码如下:

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

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * <h5>描述:全局异常处理类</h5>
 * 优先执行此异常处理类
 *
 */
@ControllerAdvice
public class MyExceptionHandler {
    private final Logger log = LoggerFactory.getLogger(getClass());

    @ExceptionHandler(value =Exception.class)
    public String exceptionHandler(HttpServletRequest request, Exception e){
        Map<String, Object> paramsMap = getMaps(request);
        Map<String, Object> headersMap = getHeaders(request);

        String requestUri = request.getAttribute("org.springframework.web.servlet.HandlerMapping.lookupPath").toString();
        log.error("请求[{}]发生[{}]异常\r\n参数[{}]\r\nheader[{}]", requestUri,e.getMessage(),paramsMap,headersMap, e);

        // 返回错误信息,交给其他异常处理类处理
        return e.getMessage();
    }

    // =================== private method ===================

    /**
     * <h5>功能:获取从request中传递过来的参数信息</h5>
     *
     * @return Map<String, Object>
     */
    private Map<String, Object> getMaps(HttpServletRequest request){
        Map<String, Object> paramMap = new HashMap<String, Object>();
        Enumeration<String> enume = request.getParameterNames();
        while (enume.hasMoreElements()) {
            String key = (String) enume.nextElement();
            String[] values = request.getParameterValues(key);
            paramMap.put(key, values.length == 1 ? request.getParameter(key).trim() : values);
        }

        return paramMap;
    }

    /**
     * <h5>功能: 获取从request中传递过来的header信息</h5>
     *
     * @return Map<String, Object>
     */
    private Map<String, Object> getHeaders(HttpServletRequest request) {
        Map<String, Object> headerMap = new HashMap<String, Object>();
        Enumeration<?> er = request.getHeaderNames();//获取请求头的所有name值
        String headerName;
        while(er.hasMoreElements()){
            headerName = er.nextElement().toString();
            headerMap.put(headerName, request.getHeader(headerName));
        }

        return headerMap;
    }
}

2. MyErrorController.java 全局错误信息处理类

后执行此类,此类可以有效抓取,404、403等信息,代码如下:

import javax.servlet.http.HttpServletRequest;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONObject;
import com.jnxj.common.vo.MessageBean;

/**
 * <h5>描述:全局错误信息处理</h5>
 *  执行完异常处理类之后执行此类
 */
@RestController
public class MyErrorController implements ErrorController {

    @Override
    public String getErrorPath() {
        return "/error";
    }

    @RequestMapping("/error")
    public String handleError(HttpServletRequest request) {
        String message;
        // 获取statusCode:401,404,500
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == 400) {
            message = "语义有误,当前请求无法被服务器理解或请求参数有误";
        } else if (statusCode == 401) {
            message = "当前请求需要用户验证";
        } else if (statusCode == 403) {
            message = "权限不足";
        } else if (statusCode == 404) {
            message = "请求的资源不存在";
        } else {
            message = "系统不小心生病了,正在紧急修复中,请耐心等候...o(╥﹏╥)o";
        }

        MessageBean messageBean = new MessageBean();
        messageBean.setCode(statusCode.toString());
        messageBean.setMessage(message);
        return JSONObject.toJSONString(messageBean);
    }
}

原文地址:https://blog.51cto.com/1197822/2465881

时间: 2024-11-07 14:57:52

SpringBoot入门二十一,全局异常处理的相关文章

SpringBoot入门二十二,使用Validation进行参数校验

项目基本配置参考文章SpringBoot入门一,使用myEclipse新建一个SpringBoot项目,使用myEclipse新建一个SpringBoot项目即可,此示例springboot升级为2.2.1版本. 1. pom.xml添加aop支持 如果已经引用了spring-boot-starter-web,就不要需要引用spring-boot-starter-validation了,本例就不再引用 <!-- 引入validation支持 --> <dependency> <

SpringBoot入门二,添加JdbcTemplate数据源

项目基本配置参考上一篇文章SpringBoot入门一,使用myEclipse新建一个SpringBoot项目即可.现在来给项目添加一个JdbcTemplate数据源,添加方式非常简单,仅需两步即可,具体内容如下: 1. pom.xml添加以下配置信息 <!-- jdbcTemplate依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring

SpringBoot入门二十,添加Websocket支持

项目基本配置参考SpringBoot入门一,使用myEclipse新建一个SpringBoot项目,使用myEclipse新建一个SpringBoot项目即可.此示例springboot的版本已经升级到2.2.1.RELEASE,具体步骤如下: 1. pom.xml添加以下配置信息 <!-- 4. 引入websocket支持 --> <dependency> <groupId>org.springframework.boot</groupId> <ar

SpringBoot入门二十三,整合Redis

项目基本配置参考文章SpringBoot入门一,使用myEclipse新建一个SpringBoot项目,使用MyEclipse新建一个SpringBoot项目即可,此示例springboot升级为2.2.1版本. 1. pom.xml添加Redis支持 <!-- 5.引入redis依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-b

springboot 入门二- 读取配置信息一

在上篇入门中简单介绍下springboot启动使用了大量的默认配置,在实际开发过程中,经常需要启动多个服务,那端口如何手动修改呢? 此篇就是简单介绍相关的配置文件信息. Spring Boot允许外部化你的配置,这样你就可以在不同的环境中使用相同的应用程序代码.你可以使用属性文件.YAML文件.环境变量和命令行参数来外部化配置.属性的值获取可以通过注解@Value . spring Environment或注解@ConfigurationProperties 这些方式优先级如下: @TestPr

SpringBoot入门(二):Controller的使用

Controller中注解的使用:   @Controller   ●该注解用来响应页面,必须配合模板来使用 关于模板的使用,下一节会说到.   @RestController ●该注解可以直接响应字符串,返回的类型为JSON格式 1 package com.example.demo.controller; 2 3 import org.springframework.web.bind.annotation.RequestMapping; 4 import org.springframework

[WebGL入门]二十一,从平行光源发出的光

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 照亮世界 上次绘制了一个像甜甜圈一样的圆环体模型,虽然没有涉及特别的新知识,但是也算成功的绘制出了3D模型了吧. 那么,这次来看一下光. 光在3D渲染中有很多种类和使用方法,想把光研究透彻,也是很不容易的. 现实世界中我们能看到物体,是因为物体反射的光进入我们的眼睛.

SpringBoot入门基础

SpringBoot入门 (一) HelloWorld 一 什么是springboot springboot是一个全新的框架,它设计的目的简化spring项目的初始环境的搭建和开发,主要有以下几个特点: 1.简化初始配置 ,可与主流框架集成: 2.内置Servlet容器,无需在打War包: 3.使用了Starter(启动器)管理依赖并版本控制: 4.大量的自动配置,简化开发,方便集成第三方: 5.提供准生产环境运行时的监控,如指标,健康,外部配置等: 6.无需XML配置,减少冗余代码 . 未使用

SpringBoot2.0系列教程(五)Springboot框架添加全局异常处理

Hello大家好,本章我们添加全局异常处理.另求各路大神指点,感谢 一:为什么需要定义全局异常 在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,所以我们需要对异常进行捕获,然后给予相应的处理,来减少程序异常对用户体验的影响 二:添加业务类异常 在前面说过的ret文件夹下创建ServiceException package com.example.demo.core.ret; import java.io.Seriali