FastJson、Jackson使用AOP切面进行日志打印异常

FastJson、Jackson使用AOP切面进行日志打印异常

一、概述

1、问题详情

使用FastJson、Jackson进行日志打印时分别包如下错误:

源码

//fastjon
log.info("\nRequest Info :{} \n"JSON.toJSONString(requestInfo));
//jackson
log.info("\nRequest Info :{} \n"new ObjectMapper().writeValueAsString(requestInfo));
  • Fastjson错误信息

    java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)at org.apache.catalina.connector.Request.getAsyncContext(Request.java:1812)at org.apache.catalina.connector.RequestFacade.getAsyncContext(RequestFacade.java:1068)
    
  • Jackson错误信息:

    com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.util.Collections$3 and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: icu.chiou.qvideo.aop.AccessLogAspect$RequestInfo["requestParams"]->java.util.HashMap["request"]->org.apache.catalina.connector.RequestFacade["parameterNames"])
    

2、问题原因

猜测:

这些错误的原因可能是由于在日志打印过程中,引入了 Web 请求的相关对象,而这些对象无法直接被序列化为 JSON。

查找:

  • 调用getAsyncContext方法出现了问题,表示当前这个request对象不是异步模式的,所以不能调用getAsyncContext这个方法,这个request的异步模式这是servlet3中的一个新特性,可以使用注解或者配置xml的方式进行开启,一般用于异步请求,这个request的异步模式的使用场景,fastjson序列化出错,出错的原因是fastjson调用了getAsyncContext方法,由于request不是异步模式,所以报错了,那么结果就是fastjson序列化出错了。
  • jackson异常信息表明 jackson 无法找到适合序列化 java.util.Collections$3 这个类的方法。这种异常通常出现在对象中包含了无法序列化的属性或者属性类型,导致 Jackson 无法将整个对象序列化为 JSON 字符串。在你的异常信息中,可以看到异常发生在 AccessLogAspectRequestInfo 对象的 requestParams 属性中,其中包含了一个 java.util.HashMap 对象,该对象中的属性为 request,类型为 org.apache.catalina.connector.RequestFacade,进而包含了 parameterNames 属性,类型为 java.util.Collections$3,而 Jackson 无法对这个属性进行序列化。

二、解决

1、问题定位

看一下异常信息,按照打印的栈信息来看:

  • RequestFacade对象中的getAsyncContext方法被调用了,但是工程里面并没用用到RequestFacade对象,且其没有重载方法
  • 查看RequestFacade类的源码过后发现RequestFacade其实是HttpServletRequest的一个具体实现
  • 那么问题就定位到了,fastjson把HttpServletRequest序列化了,只要把方法上的HttpServletRequest 参数去掉就可以了.

在这里插入图片描述

2、解决办法

把进行JSON转字符串序列化对象内的request过滤即可:

private Map<String, Object> getRequestParamsByJoinPoint(JoinPoint joinPoint) {//参数名String[] paramNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();//参数值Object[] paramValues = joinPoint.getArgs();return buildRequestParam(paramNames, paramValues);
}private Map<String, Object> buildRequestParam(String[] paramNames, Object[] paramValues) {Map<String, Object> requestParams = new HashMap<>();for (int i = 0; i < paramNames.length; i++) {Object value = paramValues[i];//添加这个if (value instanceof ServletRequest || value instanceof ServletResponse) {continue;}//如果是文件对象if (value instanceof MultipartFile) {MultipartFile file = (MultipartFile) value;value = file.getOriginalFilename();  //获取文件名}requestParams.put(paramNames[i], value);}return requestParams;
}

3、效果实现

源代码和拓展:

需要控制台格式化的输出JSON只需要调用:writerWithDefaultPrettyPrinter()

log.info("\nRequest Info :{} \n", new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(requestInfo));
log.info("\nRequest Info :{} \n", JSON.toJSONString(requestInfo));

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2777094.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 题目示例 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&a…

【正式】今年第一篇CSDN(纯技术教学)

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff08;木马、病毒、恶意脚本、webshell等&#xff09;&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方&#xff0c;由于程序对用户上传…

《Git 简易速速上手小册》第10章:未来趋势与扩展阅读(2024 最新版)

文章目录 10.1 Git 与开源社区10.1.1 基础知识讲解10.1.2 重点案例&#xff1a;Python 社区使用 Git10.1.3 拓展案例 1&#xff1a;Git 在大型开源项目中的角色10.1.4 拓展案例 2&#xff1a;支持开源项目的 Git 托管平台 10.2 新兴技术与 Git 的整合10.2.1 基础知识讲解10.2.2…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_1

《剑指Offer》笔记&题解&思路&技巧&优化_Part_1 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. LCR 120. 寻找文件副本——数组中重复元素2. LCR 121. 寻找目…

Amazon Dynamo学习总结

目录 一、Amazon Dynamo的问世 二、Amazon Dynamo主要技术概要 三、数据划分算法 四、数据复制 五、版本控制 六、故障处理 七、成员和故障检测 一、Amazon Dynamo的问世 Amazon Dynamo是由亚马逊在2007年开发的一种高度可扩展和分布式的键值存储系统&#xff0c;旨在解…

Android13多媒体框架概览

Android13多媒体框架概览 Android 多媒体框架 Android 多媒体框架旨在为 Java 服务提供可靠的接口。它是一个系统&#xff0c;包括多媒体应用程序、框架、OpenCore 引擎、音频/视频/输入的硬件设备&#xff0c;输出设备以及一些核心动态库&#xff0c;比如 libmedia、libmedi…

ARM PAC/BTI/MTE三剑客精讲与实战

一、PAC指针认证精讲与实战 思考 1、什么是栈溢出攻击&#xff1f;什么是代码重用攻击&#xff1f;区别与联系&#xff1f; 2、栈溢出攻击的软&硬件缓解技术有哪些&#xff1f;在TF-A&OPTEE上的应用&#xff1f; 3、什么是ROP攻击&#xff1f;对ROP攻击的缓解技术&…

Redis -- 数据库管理

目录 前言 切换数据库(select) 数据库中key的数量&#xff08;dbsize&#xff09; 清除数据库&#xff08;flushall flushdb&#xff09; 前言 MySQL有一个很重要的概念&#xff0c;那就是数据库database&#xff0c;一个MySQL里面有很多个database&#xff0c;一个datab…

龙芯开启ssh服务——使用Putty连接

本文采用龙芯3A6000处理器&#xff0c;Loongnix操作系统。 为了能使用其他电脑远程操控龙芯电脑&#xff0c;需要打开loongnix的ssh服务&#xff0c;并在其他电脑里使用putty连接loongnix。 1 修改ssh配置文件 命令行输入&#xff1a; sudo vim /etc/ssh/sshd_config按下i插…

【初中生讲机器学习】6. 分类算法中常用的模型评价指标有哪些?here!

创建时间&#xff1a;2024-02-07 最后编辑时间&#xff1a;2024-02-09 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

HACKTHEBOX通关笔记——mango(退役)

信息收集 端口扫描 ┌──(root㉿kali)-[~] └─# nmap -sC -sV -A -p- --min-rate10000 10.129.229.185 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-31 20:44 EST Warning: 10.129.229.185 giving up on port because retransmission cap hit (10). Nmap scan …

方案分享:F5怎么样应对混合云网络安全?

伴随着云计算走入落地阶段&#xff0c;企业的云上业务规模增长迅猛。具有部署灵活、成本低、最大化整合现有资产、促进业务创新等优点的混合云逐渐成为企业选择的部署方式。与此同时&#xff0c;安全运营的复杂度进一步提高。比如安全堆栈越来越复杂、多云基础设施和应用添加网…

攻防世界——re2-cpp-is-awesome

64位 我先用虚拟机跑了一下这个程序&#xff0c;结果输出一串字符串flag ——没用 IDA打开后 F5也没有什么可看的 那我们就F12查看字符串找可疑信息 这里一下就看见了 __int64 __fastcall main(int a1, char **a2, char **a3) {char *v3; // rbx__int64 v4; // rax__int64 v…

【机房预约系统(C++版)】

一、机房预约系统需求 1.1、系统简介 学校现有几个规格不同的机房&#xff0c;由于使用时经常出现“撞车“现象,现开发一套机房预约系统&#xff0c;解决这一问题。 1.2、身份简介 分别有三种身份使用该程序学生代表:申请使用机房教师:审核学生的预约申请管理员:给学生、教…

Git分支常用指令

目录 1 git branch 2 git branch xx 3 git checkout xx 4 git checkout -b xx 5 git branch -d xx 6 git branch -D xx 7 git merge xx(含快进模式和冲突解决的讲解) 注意git-log: 1 git branch 作用&#xff1a;查看分支 示例&#xff1a; 2 git branch xx 作用&a…

第二节课[Demo]作业

基础作业 使用 InternLM-Chat-7B 模型生成 300 字的小故事 user avatar 你是一个精通isekai的勇者&#xff0c;现在需要你讲述一段清新脱俗的异世界日常故事&#xff0c;字数300字以上robot avatar 在一个普通的早晨&#xff0c;我像往常一样起床、洗漱、吃早餐。但是&#xf…

第二十六回 母夜叉孟州道卖人肉 武都头十字坡遇张青-Ubuntu 防火墙ufw配置

武松到县里投案&#xff0c;县官看武松是个汉子&#xff0c;就把诉状改成&#xff1a;武松与嫂一时斗殴杀死&#xff0c;后西门庆前来&#xff0c;两人互殴&#xff0c;打死西门庆。上报东平府。东平府尹也可怜武松&#xff0c;从轻发落&#xff0c;最后判了个&#xff1a;脊杖…

【超高效!保护隐私的新方法】针对图像到图像(l2l)生成模型遗忘学习:超高效且不需要重新训练就能从生成模型中移除特定数据

针对图像到图像生成模型遗忘学习&#xff1a;超高效且不需要重新训练就能从生成模型中移除特定数据 提出背景如何在不重训练模型的情况下从I2I生成模型中移除特定数据&#xff1f; 超高效的机器遗忘方法子问题1: 如何在图像到图像&#xff08;I2I&#xff09;生成模型中进行高效…

Jupyter Notebook如何在E盘打开

Jupyter Notebook如何在E盘打开 方法1&#xff1a;方法2&#xff1a; 首先打开Anaconda Powershell Prompt, 可以看到默认是C盘。 可以对应着自己的界面输入&#xff1a; 方法1&#xff1a; (base) PS C:\Users\bella> E: (base) PS E:\> jupyter notebook方法2&#x…

图像批量重命名(基于Python,本地运行)

图像批量重命名(基于Python&#xff0c;本地运行) &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;场景假设&#x1f333;&#x1f333;知识储备&#x1f333;os.path.splitext方法语法示例 os.listdir方法语法示例 &#x1f333;解决方案&am…