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

     2022-05-17     210

关键词:

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

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("请求[{}]发生[{}]异常
参数[{}]
header[{}]", 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);
    }
}

springboot中全局异常处理器

  SpringBoot中全局异常处理器,就是把错误异常统一处理的方法。等价于Springmvc中的异常处理器。步骤一:基于前面的springBoot入门小demo修改步骤二:修改HelloController类  修改HelloController,使得访问/hello一定会产生异常:someexce... 查看详情

uwp开发入门(二十一)——保持ui线程处于响应状态

  GUI的程序有时候会因为等待一个耗时操作完成,导致界面卡死。本篇我们就UWP开发中可能遇到的情况,来讨论如何优化处理。  假设当前存在点击按钮跳转页面的操作,通过按钮打开的新页面,在初始化过程中存在一些耗... 查看详情

springboot系列springboot全局异常处理数据校验(代码片段)

五、SpringBoot全局异常处理、数据校验5.1SpringBoot异常处理5.1.1Controller层局部异常处理5.1.2基于@ControllerAdvice注解的Controller层的全局异常处理5.1.3HandlerExceptionResolver处理异常解析器5.2SpringBoot数据校验5.1SpringBoot异常处理我们知道在... 查看详情

springboot——全局异常处理

...异常页面动态异常页面自定义异常数据自定义异常视图在SpringBoot项目中,有默认对异常的处理的策略,也可以自己来定义全局异常处理方案。默认异常处理在请求处理方法中定义一个异常:inti=1/0;进行请求时,默认的错误页面... 查看详情

第二十一篇flowable之springboot集成flowableui(代码片段)

FlowableUI集成到SpringBootlecture:波波老师一、常见的整合方式  在Flowable工作流开发中大家最为头疼的应该就是流程设计器的整合了。常见的整合方式有两种在实际项目中集成FlowableUI这个官方的设计器通过开源的组件比如Logi... 查看详情

springboot全局异常处理

@ControllerAdvicepublicclassMyControllerAdvice{/***全局异常捕捉处理*@paramex*@return*/@ResponseBody@ExceptionHandler(value=Exception.class)publicObjecterrorHandler(HttpServletRequestrequest,HttpServletRespons 查看详情

java入门教程十一(异常处理)(代码片段)

在程序设计和运行的过程中,发生错误是不可避免的。尽管Java语言的设计从根本上提供了便于写出整洁、安全代码的方法,并且程序员也尽量地减少错误的产生,但是使程序被迫停止的错误的存在仍然不可避免。为此,Java提供... 查看详情

springboot全局异常处理

 新建包com.chy.exception,包下新建类GlobalExceptionHandler:@ControllerAdvice//controller的增强publicclassGlobalExceptionHandler{@ExceptionHandler(Exception.class)//给controller添加异常处理,括号中指定要捕获处理哪种异常,Exception. 查看详情

springboot全局异常处理

0.使用@ExceptionHandler注解(Controller层面上)  严格来说不是全局,是单类异常处理,进行异常处理的方法必须与出错的方法在同一个Controller里面。packagecom.lvjing.controller;importcom.alibaba.fastjson.JSON;importcom.lvjing.bean.ResponseBeanWith 查看详情

java多线程快速入门(二十一)

CountDownLatch(闭锁)计数器  有一个任务A,它要等待其他4个任务执行完毕之后才执行,此时就可以利用CountDownLatch来实现这种功能packagecom.cppdy;importjava.util.concurrent.CountDownLatch;classMyThread17extendsThread{privateCountDownLatchcountdownlatc 查看详情

springboot学习笔记:全局异常处理(代码片段)

SpringBoot可以使用@ControllerAdvice注解进行全局异常的处理,这样可以方便统一对异常的处理返回1.处理常见异常首先我们需要确定一个异常处理统一返回的格式@DatapublicclassBaseResult/***返回code,成功为0,失败为-1*/privateSt... 查看详情

mfc编程入门之二十一(常用控件:编辑框editcontrol)

  上一节讲了静态文本框,本节讲的是编辑框(EditControl)同样是一种很常用的控件,我们可以在编辑框中输入并编辑文本。在前面加法计算器的例子中已经演示了编辑框的基本应用。下面具体讲解编辑框的使用。  编辑框... 查看详情

《c#零基础入门之百识百例》(二十)异常处理--除数为0

C#零基础入门--穷举法前言一,异常处理概念二,实例练习--除数为02.1题目描述2.2问题分析2.3参考代码前言本文属于C#零基础入门之百识百例系列文章。此系列文章旨在为学习C#语言的童鞋提供一套系统的学习路径。此系列文章都... 查看详情

springboot全局异常统一处理(代码片段)

...ice&@ExceptionHandlerhttp异常ErrorControllerServlet异常Filter1.SpringBoot默认错误统一处理机制在基于SpringBoot的Web应用中,对于Http请求处理过程中发生的各种错误,如常见的400、404和500 查看详情

springboot全局异常处理(代码片段)

自定义异常类@EqualsAndHashCode(callSuper=true)@DatapublicclassCustomExceptionextendsRuntimeExceptionprivateIntegercode;publicCustomException(Stringmessage,Integercode)super(message);this.code& 查看详情

spring--springboot配置全局异常处理器

一、为什么要使用全局异常处理器?什么是全局异常处理器?就是把错误异常统一处理的方法。应用场景:1、当你使用jsr303参数校验器,如果参数校验不通过会抛异常,而且无法使用try-catch语句直接捕获,这时可以使用全局异... 查看详情

springboot的全局异常处理

前言本篇文章主要介绍的是SpringBoot的全局异常处理。GitHub源码链接位于文章底部。首先还是来看工程的结构在pom文件中添加相关依赖<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</j... 查看详情

springboot全局捕获异常处理!

packagecom.htli.util;importjava.util.HashMap;importjava.util.Map;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg 查看详情