2017-08-14 418 views
3

我试图创建一个自定义的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的某个位置注册这些自定义注释才能检测到?

请建议应做出什么修改,以便我们可以检测并打印实际的自定义注释名称。

在此先感谢!

+0

你如何运行你的分析?你是否提供'sonar.java.libraries'属性? –

+0

我还没有将规则与SonarQube整合在一起。这个结果来自在Eclipse中运行规则。 –

+0

你在测试中运行它吗?您的自定义注释是否在类路径中可用? –

回答

1

我假定您按照本指南并在您的测试中运行检查https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101。为了提供依赖于你的测试,你可以

+0

我在目标/测试罐中添加了自定义注释罐,它工作。 –