【问题标题】:SonarQube: Create custom rules to get custom annotations in a classSonarQube:创建自定义规则以获取类中的自定义注释
【发布时间】: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


【解决方案1】:

我假设您正在遵循本指南并在您的测试中运行检查 https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101 。要为您的测试提供依赖项,您可以

【讨论】:

  • 我在 target/test-jars 中添加了自定义注释 jar 并且它起作用了。
最近更新 更多