欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Method not found: is$jacocoData

程序员文章站 2023-12-23 16:43:58
...

Background

      最近有项目部署到DEV环境后,进行接口测试的时候,报出了Method not found: is$jacocoData的问题。然而本地环境确实正常的。

{
  "status": 500,
  "message": "Method not found: is$jacocoData",
  "countryCode": "US",
  "currencyCode": "USD",
  "data": {
    "serverName": "us-dev-mycis.synnex.org",
    "requestURL": "......",
    "requestId": "5b57c3f918034b000ca6f1be",
    "errorMessage": "Method not found: is$jacocoData",
    "errorType": "BIZERROR",
    "classType": "com.synnex.base.service.exception.BizException",
    "rootCauseStackTrace": "Method not found: is$jacocoData. com.synnex.base.service.exception.BizException: Method not found: is$jacocoData\n\tat com.synnex.address.service.validation.MD.MDServiceImpl.putMDAndUPS2Solr(MDServiceImpl.java:77)\n\tat com.synnex.address.service.validation.MD.MDServiceImpl$$FastClassBySpringCGLIB$$26b95161.invoke(<generated>)\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n\tat org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:53)\n\tat org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:337)\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:392)\n"
  }
}

     经过分析发现,在部署dev环境时候,maven集成了jacoco来统计单元测试的代码覆盖率,而本地环境没有作相应的配置。

思路:

     本地环境添加jacoco,然后进行debug,找到问题源头。

  • 在IDEA的edit configuration中的VM option添加-javaagent:D:/code/git/springboot2-lib/src/main/resources/jacoco/jacocoagent.jar=output=tcpserver,address=127.0.0.1,port=10086,includes=com.synnex.*

Method not found: is$jacocoData

(2)通过Debug找到了有问题的代码。在使用了反射的代码中,发现类多了一个字段jacocoData。因此在反序列化中就会报出Method not found: is$jacocoData的问题

Method not found: is$jacocoData

Why:

    为什么类会多jacocoData这么一个字段?

    因为Jaococ使用asm实现字节码植入,是对指令级别上的字节码植入,从而可以定位到执行的代码行。

解决方案:

     在反射遍历字段的时候,可以对字段进行判断看是否是复合字段,假如是复合字段就跳出,就可以解决这样的问题。

     Method not found: is$jacocoData

 

上一篇:

下一篇: