Я не думаю, что это ошибка, ваше нарушениеSuppressXPath просто возвращает true все время.Помните, что он оценивается с использованием узла-нарушителя в качестве узла контекста выражения.
//ClassOrInterfaceDeclaration
//
в начале выражения XPath выбирают всех потомков корня документа , так что все узлы в файле.Таким образом, //ClassOrInterfaceDeclaration
выбирает все узлы этого типа в файле, и не обязательно тот, который включает в себя узел нарушения.
['.*PrincipalRepository']
Этот предикат всегда верен, потому что любая непустая строка верна.Предикат, такой как ['foo']
, вычисляется путем преобразования строки в логическое значение с помощью функции boolean
, которая выдает true()
, если строка не пустая.(Здесь вы хотите проверить имя класса в атрибуте @Image
)
Так что в основном предикат ничего не проверяет.В результате ваш violationSuppressXPath
подавляет нарушение в любое время, когда файл, в котором обнаружено нарушение, содержит некоторые ClassOrInterfaceDeclaration в любом месте, что довольно часто.
Чтобы сделать это, вы могли бызамените его на
./ancestor::ClassOrInterfaceDeclaration[@Image = 'PrincipalRepository']
Обратите внимание, что, к сожалению, XPath 1.0 не поддерживает регулярные выражения, поэтому вы не можете выполнить тест регулярного выражения (хотя вы можете использовать contains
или имитировать ends-with
, как в этот ответ ).В этом случае, я думаю, что @SuppressWarnings("PMD.MethodNamingConventions")
, как вы придумали, более уместно.