SpringBoot 自定义全局异常处理器
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 自定义全局异常处理器相关推荐
- springBoot配置全局异常处理器
一.自定义自己的异常类MyException.java public class MyException extends RuntimeException {private int code;publ ...
- SpringBoot中定义全局异常处理器
场景 SpringBoot中创建全局异常处理器,使发生异常时能处理. 项目搭建专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/356 ...
- SpringBoot项目中的全局异常处理器 Failed to invoke @ExceptionHandler method
SpringBoot项目中的全局异常处理器 Failed to invoke @ExceptionHandler method 参考文章: (1)SpringBoot项目中的全局异常处理器 Faile ...
- springboot全局异常处理器
通过aop监控程序异常,全局异常捕获 定义全局异常处理器: import java.util.HashMap; import java.util.Map; import org.springframe ...
- SpringBoot配置全局异常捕获
SpringBoot中自带的异常捕获机制返回的默认页面比较丑,对用户来说不够人性化.所以这篇文章来讲解SpringBoot钟自定义全局异常捕获. 本文的源码已经上传GitHub:https://git ...
- SpringMVC使用HandlerExceptionResolver实现全局异常处理器
在SpringMVC中,提供了一个全局异常处理器,用于对系统中出现的异常进行统一处理.在一般的系统中,DAO层.Service层及Controller层出现异常都以"throws Excep ...
- 全局异常处理器——优雅的处理异常
是什么 全局异常处理器即 把错误异常统一处理的方法.Java开发过程中,不可避免的会遇到各种异常情况,如果不做处理往往会导致程序崩溃!面对这种情况,传统方式就是使用try/catch去捕获并处理异常, ...
- Spring Boot2.x-11 使用@ControllerAdvice和@ExceptionHandler实现自定义全局异常
文章目录 概述 未使用全局异常且未显式捕获异常的情况 使用全局异常 Step1. 自定义异常类 Step2. 封装异常信息模板 Step3. 全局异常处理类 Step4. 使用全局异常 小结 概述 我 ...
- spring设置全局异常处理器
spring设置全局异常处理器 参考文章: (1)spring设置全局异常处理器 (2)https://www.cnblogs.com/gongxijun/p/5824723.html 备忘一下.
最新文章
- tf.variance_scaling_initializer() tensorflow学习:参数初始化
- 计算机与材料成型与控制方面的应用,广东科技学院
- virtualBox NAT模式,设置虚拟机可上网,宿主机可访问虚拟机的方法
- Python之路【第八篇】python实现线程池
- Java知多少(56)线程模型
- 计算机网络学习笔记(15. OSI参考模型③、TCP/IP参考模型)
- 如何打印网页版的发票_纸质发票将消失,电子发票如何报销、打印、收集?这一篇就够了...
- cocos2d-x第一天:环境的搭建
- [ZJOI2008]树的统计
- mysql 报表设计工具_如何使用报表创建工具Navicat创建报表
- 计量经济学 联合假设检验 F统计量
- Python构建投资模型(1)——从天天基金网爬数
- 春季校园招聘简历投递量已超去年同期;亚太房地产市场现逢低买入良机 | 美通企业日报...
- PHP防范XSS攻击
- 一文读懂 Java 反射机制那些事
- 安卓11客制需求-去除设置-无障碍-放大功能
- 供应链协作平台产品设计思维导图
- 阿里云应用身份服务IDaaS新升级,云原生、高安全,极致用户体验
- eclipse 背景色 豆沙绿
- 【Mybatis】分页