我正在尝试创建一个自定义SonarQube规则,该规则将检测特定自定义Java Annotation的使用情况。这是我找到的代码,它打印了一个类中使用的所有注释的列表。
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!而不是自定义注释&#39;实际的名字。其中一个自定义注释是io.swagger.jaxrs.PATCH。
另一个注释在单独的包中定义,并由样本类导入。
我们是否必须在某处注册这些自定义注释以供API检测?
请建议应做出哪些更改,以便我们检测并打印实际的自定义注释名称。
提前致谢!
答案 0 :(得分:1)
我假设您正在遵循本指南并在测试https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101中运行检查。要为测试提供依赖关系,您可以
将jars放在target/test-jars
目录中(请参阅此处的https://github.com/SonarSource/sonar-custom-rules-examples/blob/master/java-custom-rules/pom.xml#L147查看如何使用maven依赖插件执行此操作)
使用JavaCheckVerifier.verify(filename, check, classpath)