『博客开发日记』之在AOP实现日志输出时对文件上传等进行特殊处理

本文最后更新于 2026年2月10日 晚上

在AOP实现日志输出时对文件上传等进行特殊处理


前言

在之前添加一个AOP进行接口运行时添加日志输出的功能时出现上传头像时,系统抛出 com.alibaba.fastjson.JSONException 异常,导致上传失败

原因

其根本原因在于LogAspect 切面在打印日志时,尝试使用 FastJSON 序列化所有方法参数,但 MultipartFile 对象无法被序列化

FastJSON 在序列化 MultipartFile 时,尝试获取其文件路径,但 MultipartFile 是上传的临时文件,不存在物理路径


解决方法

解决办法就是在 LogAspect 中过滤掉无法序列化的参数类型,如下

MultipartFile:只记录文件名和大小,不序列化整个对象

HttpServletRequest/Response:跳过这些 Servlet 对象

剩下的一些普通参数则正常序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 打印请求入参(过滤掉无法序列化的参数)
Object[] args = joinPoint.getArgs();
List<Object> logArgs = new ArrayList<>();
for (Object arg : args) {
if (arg instanceof MultipartFile) {
MultipartFile file = (MultipartFile) arg;
logArgs.add("MultipartFile{name='" + file.getOriginalFilename() + "', size=" + file.getSize() + "}");
} else if (arg instanceof HttpServletRequest || arg instanceof HttpServletResponse) {
// 跳过 Request 和 Response
} else {
logArgs.add(arg);
}
}
log.info("Request Args : {}", JSON.toJSONString(logArgs));

总结

在使用 AOP 记录日志时,需要注意不是所有对象都能被序列化

如文件上传、流对象、Servlet 对象等需要特殊处理 应该在序列化前进行类型检查和过滤


PS:该系列只做为作者学习开发项目做的笔记用

不一定符合读者来学习,仅供参考


预告

后续会记录博客的开发过程

每次学习会做一份笔记来进行发表

“一花一世界,一叶一菩提”


版权所有 © 2025 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/


『博客开发日记』之在AOP实现日志输出时对文件上传等进行特殊处理
http://example.com/2026/02/10/『博客开发日记』之在AOP实现日志输出时对文件上传等进行特殊处理/
作者
云梦泽
发布于
2026年2月10日
更新于
2026年2月10日
许可协议