我试图创建一个自定义的SonarQube规则,它将检测特定自定义Java注释的用法。这是我找到的代码,它打印出一个类中使用的所有注释列表。SonarQube:创建自定义规则,以获得类中的自定义注释
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!而不是Custom Annotations的实际名称。其中一个自定义注释是io.swagger.jaxrs.PATCH。
另一个注释是在一个单独的包中定义的,并由样本类导入。
我们是否需要在API的某个位置注册这些自定义注释才能检测到?
请建议应做出什么修改,以便我们可以检测并打印实际的自定义注释名称。
在此先感谢!
你如何运行你的分析?你是否提供'sonar.java.libraries'属性? –
我还没有将规则与SonarQube整合在一起。这个结果来自在Eclipse中运行规则。 –
你在测试中运行它吗?您的自定义注释是否在类路径中可用? –