SonarQube: создание пользовательских правил для получения пользовательских аннотаций в классе
Я пытаюсь создать собственное правило 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
Я получаю! Неизвестный символ! вместо фактических имен пользовательских аннотаций. Одна из пользовательских аннотаций - io.swagger.jaxrs.PATCH.
Другая аннотация определяется внутри отдельного пакета и импортируется образцом класса.
Нужно ли где-то регистрировать эти пользовательские аннотации, чтобы их мог обнаружить API?
Пожалуйста, предложите, какие изменения следует внести, чтобы мы могли обнаружить и напечатать фактическое имя пользовательской аннотации.
Заранее спасибо!
1 ответ
Я предполагаю, что вы следуете этому руководству и проводите проверку в своих тестах https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101. Чтобы предоставить зависимости для ваших тестов, вы можете либо
положить банки в
target/test-jars
каталог (смотрите, как это сделать с помощью подключаемого модуля зависимостей maven здесь https://github.com/SonarSource/sonar-custom-rules-examples/blob/master/java-custom-rules/pom.xml#L147)в своем тесте укажите собственный путь к классу, используя
JavaCheckVerifier.verify(filename, check, classpath)