Spring Web 拦截异常, 封装返回结果并记录入参

异常拦截类
	@ControllerAdvice("com.yn.netcafe")
	@ResponseBody
	public class GlobalExceptionHandler {

		// 拦截 ServiceException 异常,并封装返回结果
		@ExceptionHandler(ServiceException.class)
	    public BaseResponse serviceExceptionHandler(HttpServletResponse response, ServiceException ex , ServletRequest request) {
	        response.setStatus(200);
	        // 自定义的类
	        LogInfoHandler.LogServiceException(ex, request,logger);
	        return new BaseResponse(ex.getStatus(), ex.getMessage());
	    }
	    
	}
Request缓存类
	// 缓存request请求的InputStream,否则记录传参时直接获取body流会出现 java.io.IOException: Stream closed 错误
	@Component
	public class RequestWrapperFilter extends OncePerRequestFilter {
	
	    @Override
	    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
	        filterChain.doFilter(new ContentCachingRequestWrapper(httpServletRequest), httpServletResponse);
	    }
	
	}
参数日志记录类
	public class LogInfoHandler {
	
	    public static void LogServiceException(ServiceException ex, ServletRequest request, Logger log) {
	        try {
	            LogInfo logInfo = new LogInfo();
	            // 记录错误信息和抛出的代码位置
	            if (ex.getStackTrace() != null && ex.getStackTrace().length > 0) {
	                logInfo.setErrorMsg(ex.getLocalizedMessage() + "\n" + ex.getStackTrace()[0].toString());
	            } else {
	                logInfo.setErrorMsg(ex.getLocalizedMessage());
	            }
	            // 获取接口所有的参数
	            if (request != null && request instanceof ContentCachingRequestWrapper) {
	                NativeWebRequest webRequest = new ServletWebRequest((HttpServletRequest) request);
	                // 获取路由里的参数
	                Map<String, String> pathVariables = (Map<String, String>) webRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
	                // 获取路径后面跟的参数
	                Map<String, String[]> parameterMaps = request.getParameterMap();
	                ContentCachingRequestWrapper wrapper = (ContentCachingRequestWrapper) request;
	                // 获取body里的参数
	                String requestBody = StringUtils.toEncodedString(wrapper.getContentAsByteArray(), Charset.forName(wrapper.getCharacterEncoding()));
	                logInfo.setParameterMaps(JSON.toJSONString(parameterMaps));
	                logInfo.setPathVariables(JSON.toJSONString(pathVariables));
	                logInfo.setRequestBody(requestBody);
	            }
	            // 是否打印出所有的堆栈信息
	            if(ex.isStackLog()) {
	                log.error(JSON.toJSONString(logInfo),ex);
	            } else {
	                log.error(JSON.toJSONString(logInfo));
	            }
	        }catch (Exception e) {
	            log.error("LogServiceException 异常", e);
	            log.error(ex.getMessage(),ex);
	        }
	    }
	
	    @Data
	    private static class LogInfo {
	
	        private String errorMsg;
	
	        private String pathVariables;
	
	        private String parameterMaps;
	
	        private String requestBody;
	
	    }
	
	}

热门文章

暂无图片
编程学习 ·

DAY3-JDBC+Tomcat实现简易登陆系统

目录笔记bean包下User类dao包下UserDao类service包下UserServiceImpl类和UserService接口servlet包下HelloServlet类和LoginServlet类util包下DBUtil类xml文件 笔记 jdbc: 1.加载驱动 2.创建连接 3.写sq| 4.得到statement对象 5.执行sq|得到结果集 6.处理结果集 7.关闭资源 分…
暂无图片
编程学习 ·

JVM——Java的内存回收

Java引用的种类对于JVM的垃圾回收机制来说,如果一个对象,没有一个引用指向它,那么它就被认为是一个垃圾。那该对象就会回收。可以把JVM内存中对象引用理解成一种有向图,把引用变量、对象都当成有向图的顶点,将引用关系当成图的有向边(注意:有向边总是从引用变量指向被引…
暂无图片
编程学习 ·

Linux安全原理简介

Linux安全原理简介介绍在设置Linux计算机的所有阶段,安全性应是首要考虑之一。要在计算机上实施良好的安全策略,需要对Linux的基础知识以及所使用的某些应用程序和协议有充分的了解。Linux的安全性是一个非常重要的主题,并且有许多有关此主题的完整书籍。我不能在本教程中介…
暂无图片
编程学习 ·

利用OpenJ9大幅度降低JAVA内存占用

OpenJ9 介绍OpenJ9是一种高性能,可扩展的Java™虚拟机(VM)实现,完全符合Java虚拟机规范。在运行时,VM解释由Java编译器编译的Java字节码。VM充当语言与底层操作系统和硬件之间的翻译器。Java程序需要特定的VM才能在特定的平台(例如Linux,z /OS或Windows™)上运行。Open…
暂无图片
编程学习 ·

Fedora安装Unity Editor详细步骤

本文固定链接,转载请评论点赞,么么哒 一、起因: 最近一直在用Unity开发Linux版本的应用或者说游戏。Linux是Fedora版本的。Unity官方很早就开始说要专门针对Linux做编辑器了。于是就萌生了要在Fedora上装个Unity的想法。 二、背景: Announcing the Unity Editor for Linux …
暂无图片
编程学习 ·

Leetcode 题解 - 排序

快速选择 用于求解 Kth Element 问题,使用快速排序的 partition() 进行实现。 需要先打乱数组,否则最坏情况下时间复杂度为 O(N2)。 堆排序 用于求解 TopK Elements 问题,通过维护一个大小为 K 的堆,堆中的元素就是 TopK Elements。 堆排序也可以用于求解 Kth Element …
暂无图片
编程学习 ·

30 个纯 HTML5 实现的游戏

作者:Danny Markov 来源:tutorialzin 译者:前端小智浏览器和 JavaScript 的功能逐年不断的变强变大。曾几何时,任何类型的游戏都需要Flash。但随着 HTML5 发展,HTML5 + WebGL 游戏式就慢慢占领着这个舞台。以下是30款流行的游戏,它们可以在所有现代浏览器中运行,并且只使…
暂无图片
编程学习 ·

数据表的规范

数据库的设计范式 六种范式 1. 第一范式 2. 第二范式 3. 第三范式 4. BCNF 巴斯-科德范式 5. 第四范式 6. 第五范式 完美范式 * 范式设计越高阶,冗余度越低。数据表中的键 1. 超键: 能唯一标识元组的属性集叫超键 2. 候选键:如果超键不包括多余的属性,这个超键就是候选键 …
暂无图片
编程学习 ·

CentOS系统安装好之后输入ifconfig指令无法查看ip解决办法

CentOS系统安装好之后输入ifconfig指令无法查看ip解决办法 第一次使用虚拟机安装CentOS系统,安装完之后想要通过Xshell连接Linux系统,在输入ifconfig指令后,无法查看到ip地址,也就无法通过ip地址连接Linux系统 本人经过多次百度,找了很多的解决办法都无法解决问题,但也发现了无…
暂无图片
编程学习 ·

Java语言基础之封装&构造方法&静态的使用

面向对象思想概述 概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对象,强调具备功能的对象。 思想特点:面向对象思维方式是一种更符合人们思考习惯的思想 面向过程思维方式中更多的体现的是执行者(自己做事情),面向对象中更多…
暂无图片
编程学习 ·

近三位数增长,苏宁银行金融科技之花结出普惠金融之果

文|曾响铃来源|科技向令说(xiangling0815)美联储无限QE,2020年中国不设GDP目标,2万亿直达基层扶危纾困……国内疫情已经基本控制,经济基本面迎来全面复苏阶段,作为市场中最活跃的存在之一,小微企业在复苏过程中,面临的融资难等问题也被热议。在中国有一群喊着帮助小微企…
暂无图片
编程学习 ·

神经网络模型(Backbone)

转自:https://www.cnblogs.com/silence-cho/p/11620863.html神经网络模型(Backbone)自己搭建神经网络时,一般都采用已有的网络模型,在其基础上进行修改。从2012年的AlexNet出现,如今已经出现许多优秀的网络模型,如下图所示。 主要有三个发展方向:Deeper:网络层数更深,代…
暂无图片
编程学习 ·

兔(图)解之初识贪心算法

嗯,好想她呀....加油生活。 希望她好好的....剪绳子 给你一根长度为 n 的绳子,请把绳子剪成 m 段(m、n 都是整数,n>1 并且 m>1),每段绳子的长度记为 k[0],k[1],...,k[m]。请问 k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成 …
暂无图片
编程学习 ·

mysql5.7安装

本篇文章介绍的是mysql5.7安装教程! 环境:Windows 类型:msi Mysql安装包可以去官网下载 mysql官网下载 也可以加入我们群聊下载(群文件mysql文件夹下) 另外,加入群聊也可以远程安装 文章目录mysql 5.7安装 准备安装包安装步骤第一步同意协议第二步选择手动安装第三步选择…
暂无图片
编程学习 ·

剑指Offer(4)--重建二叉树

文章目录题目思路代码 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路首先我们看上面的图片,首…
暂无图片
编程学习 ·

企业实战--kubernetes(九)---存储(Secret)

一、Secret简介 Secret对象类型用来保存敏感信息,例如密码、OAuth令牌和ssh key。 敏感信息放在Secret中比放在Pod的定义或者容器镜像中来说更加安全和灵活。 Pod可以用两种方式来使用Secret: 作为volume中的文件被挂载到pod中的一个或多个容器中。 当kubelet为pod拉取镜像时…
暂无图片
编程学习 ·

SqueezeNet/SqueezeNext简述 | 轻量级网络

SqueezeNet系列是比较早期且经典的轻量级网络,SqueezeNet使用Fire模块进行参数压缩,而SqueezeNext则在此基础上加入分离卷积进行改进。虽然SqueezeNet系列不如MobieNet使用广泛,但其架构思想和实验结论还是可以值得借鉴的。来源:晓飞的算法工程笔记 公众号SqueezeNet论文: …
暂无图片
编程学习 ·

库存补单及销量预测

库存补单的数学模型 摘要根据顾客对商品的需求,科学合理的制定库存补单决策对于自家商店发展具有重大的影响,进而成为商家关注的热点问题。本文研究的是补单的策略问题。针对问题一,是典型的预测问题,要求我们能够准确的预测出未来五天的日销售量。由于日销售量是个非线性的…
暂无图片
编程学习 ·

Vue安装以及项目搭建

Vue从入门到入土系列一只不务正业的Java后端码畜今天又来研究前端Vue了。1、要搭建运行Vue项目,首先得安装一个东西叫Node。网上有很多教程这里推荐博主使用的菜鸟教程。传送门》》》》当你安装成功后测试一下安装是否成功,npm包含在Node里面的,一般安装成功就有>>>…
暂无图片
编程学习 ·

STM32串口空闲中断idle说明

1.空闲中断的触发机制:空闲中断是在监测到数据接收后(即串口的RXNE位被置位)开始检测,当总线上在一个字节对应的周期内未再有新的数据接收时,触发空闲中断IDLE位被硬件置1.2.IDEL位清零实现:查看stm32参考手册,要注意IDEL位的清零是通过先读取USART_SR,再读取USART_DR实…