Closed majincheng closed 1 year ago
我验证了一下,通过RunnerWriteDb.run()方法来执行解析jar包和写入数据库的操作,上面的情况注解的属性是能获取到的 比如在示例代码https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/test/java/test/call_graph/spring/mvc/TestSpringController1.java中有以下方法:
@GetMapping("get1")
@ResponseBody
public String get() {
在解析生成的method_annotation
文件及对应的数据库表中,这个方法的@GetMapping注解是有属性名称的:
test.call_graph.spring.mvc.TestSpringController1:get() org.springframework.web.bind.annotation.GetMapping value ls ["get1"]
今天在运行的时候, method_annotation表里的attribute_name有值了:'value' 但是在进行顶层分析TestRunnerGenAllGraph4Callee.main的时候, 生成的文件里依旧缺失方法上 @GetMapping("/test")里的内容, 针对今天的问题, 排查发现从数据库里查询的时候, 缺少attribute_name字段查询。 方法:com.adrninistrator.jacg.handler.annotation.AnnotationHandler#queryAnnotationMap4FullMethod 原始SQL: sql = "select " + JACGSqlUtil.joinColumns(DC.MA_METHOD_HASH, DC.COMMON_ANNOTATION_ANNOTATION_NAME, DC.COMMON_ANNOTATION_ATTRIBUTE_TYPE, DC.COMMON_ANNOTATION_ATTRIBUTE_VALUE) + " from " + DbTableInfoEnum.DTIE_METHOD_ANNOTATION.getTableName() + " where " + DC.MA_METHOD_HASH + " = ?"; 缺少字段: DC.COMMON_ANNOTATION_ATTRIBUTE_NAME
现在只显示了Spring Controller类上的URI信息,没有显示方法上的URI信息,本来是需要拼在一起显示的,我改一下这个问题
修复了上面的问题,最新版本: 1.0.9 感谢反馈
例如: @GetMapping("/test") 在分析时, 理应分析为 value = "/test" 但是入库时为 attribute_name:null , attribute_value:/test 造成的影响是,SpringMvcRequestMappingFormatter#getPathInRequestMappingAnnotation 分析path的时候, 只会取path和value, 无法取出null的, 丢失部分path
目前解决方案: 1.入库前做兼容: com.adrninistrator.jacg.handler.write_db.WriteDbHandler4MethodAnnotation#genData 59行, 修改为 attributeName = Optional.ofNullable(array[2]).orElse("value");
2.从数据库里取出来的时候做兼容 com.adrninistrator.jacg.handler.annotation.AnnotationHandler#genAnnotationMapFromQueryResult 317行, 修改为 attributeMap.put(Optional.ofNullable(attributeName).orElse("value"), annotationAttribute);