SpringBoot自定义全局异常处理器

  • 一、maven依赖
  • 二、GlobalExceptionHandler.java
  • 三、ResponseStandard.java
  • 四、logback.xml
  • 五、测试

GitHub: link. 欢迎star

注意:本篇博客风格(不多比比就是撸代码!!!)

一、maven依赖

        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency>

二、GlobalExceptionHandler.java

import com.andon.springbootutil.domain.ResponseStandard;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletRequest;
import java.util.stream.Collectors;/*** @author Andon* 2021/11/10* <p>* 全局异常处理器*/
@Slf4j
@RestControllerAdvice //对Controller增强,并返回json格式字符串
public class GlobalExceptionHandler {/*** 捕获参数校验异常*/@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseStandard<Object> exception(MethodArgumentNotValidException e, HttpServletRequest request) {String error = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";"));log.warn("request warn!! method:{} uri:{} error:{}", request.getMethod(), request.getRequestURI(), error);return ResponseStandard.builder().code(-1).message(error).build();}/*** 捕获参数校验异常*/@ExceptionHandler(IllegalArgumentException.class)public ResponseStandard<Object> exception(IllegalArgumentException e, HttpServletRequest request) {log.warn("request warn!! method:{} uri:{} error:{}", request.getMethod(), request.getRequestURI(), e.getMessage());return ResponseStandard.builder().code(-1).message(e.getMessage()).build();}/*** 捕获Exception异常,并自定义返回数据*/@ExceptionHandler(Exception.class)public ResponseStandard<Object> exception(Exception e, HttpServletRequest request) {log.error("request error!! method:{} uri:{}", request.getMethod(), request.getRequestURI());log.error(getExceptionDetail(e));return ResponseStandard.builder().code(-1).message(request.getMethod() + " " + request.getRequestURI() + " " + e.getMessage()).build();}/*** 获取代码报错详细位置信息*/public String getExceptionDetail(Exception e) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(e.getClass()).append(System.getProperty("line.separator"));stringBuilder.append(e.getLocalizedMessage()).append(System.getProperty("line.separator"));StackTraceElement[] arr = e.getStackTrace();for (StackTraceElement stackTraceElement : arr) {stringBuilder.append(stackTraceElement.toString()).append(System.getProperty("line.separator"));}return stringBuilder.toString();}
}

三、ResponseStandard.java

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** @author Andon* 2021/11/10*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ResponseStandard<T> implements Serializable {private int code;private String message;private T data;private int total;public static <T> ResponseStandard<T> successResponse(T t) {ResponseStandard<T> response = new ResponseStandard<>();response.setCode(0);response.setMessage("success!!");response.setData(t);response.setTotal(0);return response;}public static <T> ResponseStandard<T> failureResponse(T t) {ResponseStandard<T> response = new ResponseStandard<>();response.setCode(-1);response.setMessage("failure!!");response.setData(t);response.setTotal(0);return response;}
}

四、logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 动态日志级别 --><jmxConfigurator/><!-- 定义日志文件 输出位置 --><property name="log_dir" value="log"/><!-- 日志最大的历史 10天 --><property name="maxHistory" value="10"/><!-- 彩色日志格式 --><property name="CONSOLE_LOG_PATTERN"value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) - %cyan(%msg%n)"/><!-- ConsoleAppender 控制台输出日志 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern><!-- 设置日志输出格式 --><!--  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n  -->${CONSOLE_LOG_PATTERN}</pattern></encoder></appender><!-- ERROR级别日志 --><!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender --><appender name="ERROR"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 过滤器,只记录WARN级别的日志 --><!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 设置过滤级别 --><level>ERROR</level><!-- 用于配置符合过滤条件的操作 --><onMatch>ACCEPT</onMatch><!-- 用于配置不符合过滤条件的操作 --><onMismatch>DENY</onMismatch></filter><!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志输出位置 可相对、和绝对路径 --><fileNamePattern>${log_dir}/error/%d{yyyy-MM-dd}.error.log</fileNamePattern><!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6, 则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 --><maxHistory>${maxHistory}</maxHistory></rollingPolicy><encoder><pattern><!-- 设置日志输出格式 -->%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern></encoder></appender><!-- WARN级别日志 appender --><appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 过滤器,只记录WARN级别的日志 --><!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 设置过滤级别 --><level>WARN</level><!-- 用于配置符合过滤条件的操作 --><onMatch>ACCEPT</onMatch><!-- 用于配置不符合过滤条件的操作 --><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志输出位置 可相对、和绝对路径 --><fileNamePattern>${log_dir}/warn/%d{yyyy-MM-dd}.warn.log</fileNamePattern><maxHistory>${maxHistory}</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern></encoder></appender><!-- INFO级别日志 appender --><appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log_dir}/info/%d{yyyy-MM-dd}.info.log</fileNamePattern><maxHistory>${maxHistory}</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern></encoder></appender><!-- DEBUG级别日志 appender --><appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log_dir}/debug/%d{yyyy-MM-dd}.debug.log</fileNamePattern><maxHistory>${maxHistory}</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern></encoder></appender><!-- TRACE级别日志 appender --><appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>TRACE</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log_dir}/trace/%d{yyyy-MM-dd}.trace.log</fileNamePattern><maxHistory>${maxHistory}</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern></encoder></appender><!-- root级别   info --><root><!-- 打印info级别日志及以上级别日志 --><level value="info"/><!-- 控制台输出 --><appender-ref ref="console"/><!-- 文件输出 --><appender-ref ref="ERROR"/><appender-ref ref="INFO"/><appender-ref ref="WARN"/><appender-ref ref="DEBUG"/><appender-ref ref="TRACE"/></root>
</configuration>

五、测试




GitHub: link. 欢迎star

SpringBoot 自定义全局异常处理器相关推荐

  1. springBoot配置全局异常处理器

    一.自定义自己的异常类MyException.java public class MyException extends RuntimeException {private int code;publ ...

  2. SpringBoot中定义全局异常处理器

    场景 SpringBoot中创建全局异常处理器,使发生异常时能处理. 项目搭建专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/356 ...

  3. SpringBoot项目中的全局异常处理器 Failed to invoke @ExceptionHandler method

    SpringBoot项目中的全局异常处理器 Failed to invoke @ExceptionHandler method 参考文章: (1)SpringBoot项目中的全局异常处理器 Faile ...

  4. springboot全局异常处理器

    通过aop监控程序异常,全局异常捕获 定义全局异常处理器: import java.util.HashMap; import java.util.Map; import org.springframe ...

  5. SpringBoot配置全局异常捕获

    SpringBoot中自带的异常捕获机制返回的默认页面比较丑,对用户来说不够人性化.所以这篇文章来讲解SpringBoot钟自定义全局异常捕获. 本文的源码已经上传GitHub:https://git ...

  6. SpringMVC使用HandlerExceptionResolver实现全局异常处理器

    在SpringMVC中,提供了一个全局异常处理器,用于对系统中出现的异常进行统一处理.在一般的系统中,DAO层.Service层及Controller层出现异常都以"throws Excep ...

  7. 全局异常处理器——优雅的处理异常

    是什么 全局异常处理器即 把错误异常统一处理的方法.Java开发过程中,不可避免的会遇到各种异常情况,如果不做处理往往会导致程序崩溃!面对这种情况,传统方式就是使用try/catch去捕获并处理异常, ...

  8. Spring Boot2.x-11 使用@ControllerAdvice和@ExceptionHandler实现自定义全局异常

    文章目录 概述 未使用全局异常且未显式捕获异常的情况 使用全局异常 Step1. 自定义异常类 Step2. 封装异常信息模板 Step3. 全局异常处理类 Step4. 使用全局异常 小结 概述 我 ...

  9. spring设置全局异常处理器

    spring设置全局异常处理器 参考文章: (1)spring设置全局异常处理器 (2)https://www.cnblogs.com/gongxijun/p/5824723.html 备忘一下.

最新文章

  1. tf.variance_scaling_initializer() tensorflow学习:参数初始化
  2. 计算机与材料成型与控制方面的应用,广东科技学院
  3. virtualBox NAT模式,设置虚拟机可上网,宿主机可访问虚拟机的方法
  4. Python之路【第八篇】python实现线程池
  5. Java知多少(56)线程模型
  6. 计算机网络学习笔记(15. OSI参考模型③、TCP/IP参考模型)
  7. 如何打印网页版的发票_纸质发票将消失,电子发票如何报销、打印、收集?这一篇就够了...
  8. cocos2d-x第一天:环境的搭建
  9. [ZJOI2008]树的统计
  10. mysql 报表设计工具_如何使用报表创建工具Navicat创建报表
  11. 计量经济学 联合假设检验 F统计量
  12. Python构建投资模型(1)——从天天基金网爬数
  13. 春季校园招聘简历投递量已超去年同期;亚太房地产市场现逢低买入良机 | 美通企业日报...
  14. PHP防范XSS攻击
  15. 一文读懂 Java 反射机制那些事
  16. 安卓11客制需求-去除设置-无障碍-放大功能
  17. 供应链协作平台产品设计思维导图
  18. 阿里云应用身份服务IDaaS新升级,云原生、高安全,极致用户体验
  19. eclipse 背景色 豆沙绿
  20. 【Mybatis】分页

热门文章

  1. JavaScript编辑器介绍
  2. 如何在Android Framework中添加自定义硬件编解码器?
  3. Postgresql on conflict do update 设置当前值,原始值,当前值与原始值相加值
  4. 再次强调完成的定义(DoD)
  5. torch-sparse安装教程
  6. IP地址分类,私有地址
  7. Java提取URL某个参数的值
  8. T-3.2-把Redis当作消息队列合不合适
  9. 客户端连接WSUS服务器时代码80244010 windows更新遇到未知错误
  10. MySql InnoDB与MyISAM的区别