2016-10-18 1 views
1

Как написать правило PMD, которое будет искать аннотацию javax.validation.constraints.NotNull и проверить, имеет ли он атрибут сообщения?PMD найти аннотацию и проверить, есть ли атрибут

Bad:

@NotNull 
private int value; 

Хорошо

@NotNull(message = "value cannot be null.") 
private int value; 

Главная забота для меня является то, что эта аннотация может быть размещена basicaly где-нибудь

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 

ответ

1

Вот запрос XPath к найти N otNull аннотации без сообщения:

Я проверил все случаи, за исключением ANNOTATION_TYPE, что я не уверен, как тестировать в приложении PMD builder.

Если вы хотите, чтобы все javax.validation.constraints я придумал с этим: //Annotation[*/Name/@Image = tokenize(replace(string-join(//ImportDeclaration/Name/@Image[starts-with(., "javax.validation.constraints.")], "|"), "javax.validation.constraints.", ""), '[|]') and not(.//MemberValuePair/@Image = 'message')]

Итак: взять весь импорт, которые начинаются с javax.validation.constraints., конвертировать в строку с string-join, удалить javax.validation.constraints. с replace и разделить обратно в набор значениями с tokenize.

+0

Отлично! Я буду проверять этот xpath завтра. Если я еще не прошу слишком много, не могли бы вы привести пример, как я могу изменить этот xpath, поэтому он будет искать другие аннотации из пакета javax.validation.constraints', например @AssertTrue или @Min, если они также имеют ' атрибут message'? – Tomasz

+1

Решение грубой силы должно быть «или» им: '//Annotation[./*/Name[@Image = 'NotNull' или @Image = 'AssertTrue' или ...] и не (.// MemberValuePair/@ Image = 'message')] ', но с [всеми аннотациями] (https://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html), что будет быть немного раздражающим. PMD имеет собственный анализатор java, который не знает, используется ли аннотация из 'javax.validation.constraints'. Возможно, это было бы возможно с некоторыми очень хакерскими запросами в операциях импорта. – HairyFotr

+0

Я придумал довольно сумасшедший запрос, который работает для меня в pmd-дизайнере с проверкой XPath 2.0, но, пожалуйста, дайте мне знать, если он также работает в наборе правил. – HairyFotr

Смежные вопросы