使用@Profiled注解或自定义AOP拦截打印日志json序列化失败

使用@Profiled注解或自定义AOP拦截打印日志json序列化失败项目中使用@Profiled注解方式进行统一日志打印输出fastjson踩坑记录一下1:@Profiled注解方式如上图:方法上使用注解@Profiled,因为我的入参有HttpServletResponse,日志打印时会对所有入参进行序列化操作,所对以HttpServletResponse进行JSON.toJSONString()转换会抛出以上异常,此时要么干掉HttpServletResponse,或者换一种方式手动注入HttpServletResponse即可解决以上异常,如下图:

大家好,又见面了,我是你们的朋友全栈君。

项目中使用@Profiled注解方式进行统一日志打印输出fastjson踩坑记录一下

1:@Profiled注解方式

使用@Profiled注解或自定义AOP拦截打印日志json序列化失败

使用@Profiled注解或自定义AOP拦截打印日志json序列化失败

如上图:

方法上使用注解@Profiled,因为我的入参有HttpServletResponse,日志打印时会对所有入参进行序列化操作,所对以HttpServletResponse进行JSON.toJSONString()转换会抛出以上异常,此时要么干掉HttpServletResponse,或者换一种方式手动注入HttpServletResponse即可解决以上异常,如下图:

ServletRequest,ServletResponse,MultipartFile 不能被序列化

使用@Profiled注解或自定义AOP拦截打印日志json序列化失败

2:自定义AOP拦截打印日志方式

Object[] args = joinPoint.getArgs();

获取入参的时候,args还包含了一些其他的内容,比如ServletReques,ServletResponset等,而这些入参并不能进行序列化,所以JSON.toJSONString时会抛出异常。

解决方法就是过滤掉args里不能被序列化的参数,如下:

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.net/134567.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 卡巴斯基引领2019工控安全升级,开创智能+新未来「建议收藏」

    卡巴斯基引领2019工控安全升级,开创智能+新未来「建议收藏」2019年6月19日下午,2019工控安全态势暨卡巴斯基、京东方科技集团股份有限公司(以下简称“京东方”)与北京安渡神州科技有限公司(以下简称“安渡神州”)战略合作发布会在京举行。在全球知名信息安全厂商卡巴斯基领先安全技术的引领下,中国安全行业相关政府机构及行业组织、企事业单位领导、工控行业重要用户以及安全技术爱好者等代表共聚共享共促,本着领先科技赋能工业转型的核心原则,共同探讨未来工控安全领域新…

    2022年8月20日
    9
  • 中国的程序员数量是否已经饱和或者过剩?「建议收藏」

    中国的程序员数量是否已经饱和或者过剩?「建议收藏」根据教育部数据显示:2020年本科毕业生人数874万人。《2020年中国大学生就业报告》显示:计算机类本科生在2020届毕业生数量中稳居前10。每年都有源源不断的新生力量加入程序员大军。另一方面,5G时代到来,对于互联网行业来说,未来将会有更多机会。各大互联网公司进入了新一轮技术资源抢占与加速发展;经过疫情的洗礼,各大传统企业也纷纷加入转型大军,重点发展线上业务;从国家“新基建”的行业分布来看,大多涉及互联网IT行业,预示了未来科学技术的发展走向……可以看到IT行业技术不断更新,专业IT人才随时都处

    2022年8月31日
    3
  • assert函数解析[通俗易懂]

    assert函数解析[通俗易懂]一、assert是宏明确一点:在C中,ASSERT是宏而不是函数。assert()是一个调试程序时经常使用的宏。在程序运行时它计算括号内的表达式。如果表达式为FALSE(0),程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常用来判断程序中是否出现了明显非法的数据,如果出现就终止程序以免导致严重后果,同时反馈错误发生“地点”。

    2025年5月24日
    5
  • oracle的todate函数的日期格式_oracle date格式

    oracle的todate函数的日期格式_oracle date格式转自http://apps.hi.baidu.com/share/detail/10070907OracleTO_DATE日期格式大全Oracle中TO_DATE格式2009-04-1410:53TO_DATE格式(以时间:2007-11-02  13:45:25为例)       Year:            yytwodigits两位年              …

    2022年10月12日
    4
  • C#如何:编写简单的 Parallel.ForEach 循环

    C#如何:编写简单的 Parallel.ForEach 循环如何:编写简单的Parallel.ForEach循环本文档使用lambda表达式在PLINQ中定义委托。如果不熟悉C#或VisualBasic中的lambda表达式,请参阅PLINQ和TPL中的Lambda表达式。示例此示例假定C:\Users\Public\Pictures\SamplePictures文件夹中有几个.jpg文件,并创建名为“Modified”的新子文件夹。运行该示例时,它会旋转示例图片中的每个.jpg图像并将其保存到.

    2022年7月19日
    14
  • fork join原理_典型相关分析

    fork join原理_典型相关分析privateForkJoinPool(intparallelism,ForkJoinWorkerThreadFactoryfactory,UncaughtExceptionHandlerhandler,intmode,StringworkerNamePrefix)fo…

    2026年2月4日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号