大家好,又见面了,我是你们的朋友全栈君。
项目中使用@Profiled注解方式进行统一日志打印输出fastjson踩坑记录一下
1:@Profiled注解方式
如上图:
方法上使用注解@Profiled,因为我的入参有HttpServletResponse,日志打印时会对所有入参进行序列化操作,所对以HttpServletResponse进行JSON.toJSONString()转换会抛出以上异常,此时要么干掉HttpServletResponse,或者换一种方式手动注入HttpServletResponse即可解决以上异常,如下图:
ServletRequest,ServletResponse,MultipartFile 不能被序列化
2:自定义AOP拦截打印日志方式
Object[] args = joinPoint.getArgs();
获取入参的时候,args还包含了一些其他的内容,比如ServletReques,ServletResponset等,而这些入参并不能进行序列化,所以JSON.toJSONString时会抛出异常。
解决方法就是过滤掉args里不能被序列化的参数,如下:
代码语言:javascript复制Object[] args = joinPoint.getArgs();
Object[] newArgs = new Object[args.length];
for (int i = 0; i < args.length; i ) {
if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse || args[i] instanceof MultipartFile) {
//ServletRequest 、ServletResponse 、 MultipartFile不能序列化,从入参里排除,否则报异常
continue;
}
newArgs[i] = args[i];
}
String paramter = "";
if (newArgs != null) {
try {
paramter = JSONObject.toJSONString(newArgs);
} catch (Exception e) {
paramter = newArgs.toString();
}
}
logger.info("请求开始{" logId "}:clazzName: " clazzName ", methodName:" methodName ", 参数:" paramter);
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134567.html原文链接:https://javaforall.cn