【发布时间】:2024-01-06 14:09:01
【问题描述】:
我正在尝试创建一个自定义 SonarQube 规则,该规则将检测特定自定义 Java 注释的使用情况。这是我找到的代码,它打印了一个类中使用的所有注释的列表。
public class SampleAnnotationCheck extends IssuableSubscriptionVisitor {
@Override
public List<Tree.Kind> nodesToVisit() {
return ImmutableList.of(Tree.Kind.METHOD);
}
@Override
public void visitNode(Tree tree) {
MethodTree methodTree = (MethodTree) tree;
for (AnnotationInstance ai : ((JavaSymbol.MethodJavaSymbol) methodTree.symbol()).metadata().annotations()) {
System.out.println(ai.symbol().name());
}
}
}
示例 Java 文件:
@GET
@Path(values)
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
method1(...) {...}
@CustomAnnotation(values)
@POST
@Path(values)
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
method2(...) {...}
@PATCH
@Path(values)
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
method3(...) {...}
预期输出:
GET
Path
Consumes
Produces
CustomAnnotation
POST
Path
Consumes
Produces
PATCH
Path
Consumes
Produces
实际输出:
GET
Path
Consumes
Produces
!unknownSymbol!
POST
Path
Consumes
Produces
!unknownSymbol!
Path
Consumes
Produces
我得到了 !unknownSymbol!而不是自定义注释的实际名称。自定义注释之一是 io.swagger.jaxrs.PATCH。
另一个注解在一个单独的包中定义并由示例类导入。
我们是否必须在某处注册这些自定义注释以供 API 检测?
请建议应该进行哪些更改,以便我们可以检测并打印实际的自定义注释名称。
提前致谢!
【问题讨论】:
-
您如何进行分析?您是否提供
sonar.java.libraries属性? -
我尚未将规则与 SonarQube 集成。此结果来自在 Eclipse 中运行规则。
-
您是否在测试中运行它?您的自定义注释在类路径中可用吗?
-
@Tibor Blenessy 我正在按照编写自定义 Java 规则 101 页面中提供的步骤进行操作。我创建了一个自定义规则类和一个指向示例 Java 类的 JUnit 类。我已将自定义注释放置在示例类项目的构建路径中。您有关于如何使用声纳 API 的文档吗?
标签: java annotations sonarqube