codefuse-ai/CodeFuse-Query

java调用链分析无法追踪到链路-如果需要其他信息可以找我获取

Closed this issue · 12 comments

通过ide追踪上层接口调用无法追踪到调用链路,这个是通过ide追踪到的上层调用接口
以下是调用方法的接口源码信息:

@ResponseBody
@ApiOperation(value = "接口注解")
@PostMapping(value = "接口path", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public Result houseOwnerContractInsert(@RequestParam Map<String, Object> formData) {
    PermEnum.check(PermEnum.CJTGYZHT);
    ContractUpdateReq req = ContractUpdateReq.builder().build();
    ContractUpdateReq insertReq = RequestParseUtil.parse(req, formData);
    ValidateUtil.validate(insertReq);
    insertReq.setSource(SourceEnum.PC.getType());
    Long result = facade.getLogicFacade().getInHouseContractLogic()
            .commitHouseOwnerContract(insertReq, formData);
    return Results.getOkResult(result);
}

你期望的是哪部分的调用信息?houseOwnerContractInsert 方法调用了 facade.getLogicFacade() 方法吗?

正常的链路是houseOwnerContractInsert到commitHouseOwnerContract(insertReq, formData)再到commitCheck,实际情况是commitHouseOwnerContract(insertReq, formData)到commitCheck是OK的,但是houseOwnerContractInsert到commitHouseOwnerContract(insertReq, formData)有缺失;
给的代码里面有问题的调用之间有两层封装:第一层:facade.getLogicFacade() 第二层:getInHouseContractLogic()
这两层封装里面用到了@Getter注解,看看是不是这里有问题

/**

/**

  • Facade
    */
    @service
    @Getter
    public class LogicFacade {
    @resource
    private InHouseContractLogic inHouseContractLogic;
    }
    这两层里面代码块

houseOwnerContractInsert到commitHouseOwnerContract(insertReq, formData)有缺失;

  1. houseOwnerContractInsert 没有直接调用 commitHouseOwnerContract 方法。
  2. 检查 getLogicFacade() 返回的对象,其代码是否在源代码中。如果是三方依赖代码则会缺失。

另外,如果你希望我们排查问题,请提供示例代码和使用的godel脚本,放到自己的github仓库中,保证能运行并复现问题。仅代码片段难以复现问题

analyzetest.zip
这个是编写的demo文件,只需要解压把项目包名改为你本地的项目名即可作为链路分析的文件,修改的代码块是InHouseContractLogicImpl.java文件里面的checkAndWrapContractRentSeekingInfo方法

@zhouang777 demo文件已上传,请再帮忙看看

目前的一些调查结论:ast 解析工具未能解析出具体的方法调用。介于该代码片段无法编译,不确定这是否被视为正常行为。

// PsiMethodCallExpression:logicFacade.getInHouseContractLogic() 
PsiMethod psiMethod = expression.resolveMethod();  // psiMethod is null

如果你还想继续排查,请提供能过javac编译的代码,上传到自己的github仓库中

ChainAnalyze.zip
@zhouang777 文件已更新,麻烦再看下

尝试了下应该是lombok的问题,可以把 Getter注解 换成普通getter方法再试试

这块可以兼容吗?当前看了下已有的项目均是这个写法,存量有点重

无编译分析要支持lombok改造比较大,短期内不好支持。你可以试试先用 delombok 把项目整体还原到普通getter的方式再来分析,https://projectlombok.org/features/delombok

好的,我这边试试,感谢