2015-02-04 2 views

ответ

3

Мы используем, например, эти правила для подавления проверки в отношении методов REST для итоговой декларации. Может быть, вам нужно подобное?

<rule ref="rulesets/java/optimizations.xml/MethodArgumentCouldBeFinal"> 
    <properties> 
     <!-- Ignore Rest resources --> 
     <property name="violationSuppressXPath" value=" 
      //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='GET'] | 
      //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='POST']| 
      //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='PUT'] | 
      //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='DELETE']" /> 
    </properties> 
</rule> 
+3

Будьте осторожны при использовании этого XPath - это абсолютное выражение XPath, что означает, что вы будете отключить это правило для любого класса, который имеет по крайней мере один метод с аннотацией @ GET/POST @/@ PUT/@УДАЛИТЬ. Это замаскирует нарушения в том же классе на методы, которые не аннотируются. – adangel

2

PMD предоставляет несколько способов для подавления предупреждений: http://pmd.sourceforge.net/pmd-5.2.3/usage/suppressing.html

  • с помощью аннотаций: @SuppressWarnings ("PMD")
  • через Комментарии: // NOPMD игнорировать этот
  • через Regex и XPath в соответствии с правилами

Вы также можете исключить полные файлы - см http://pmd.sourceforge.net/pmd-5.2.3/customizing/howtomakearuleset.html - Исключение файлов из набора правил

В вашем случае, violationSuppressXPath это выражение XPath должно работать:

./ancestor::ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation/Name[@Image='GET'] 

Это будет идти вверх (предок) из текущего узла (который может находиться внутри метода) в объявлении метода («ClassOrInterfaceBodyDeclaration») и идет вниз по дереву оттуда, чтобы проверить аннотацию @GET. Однако я не знаю о влиянии производительности.

Update:

Полный пример:

<rule ref="rulesets/java/optimizations.xml/MethodArgumentCouldBeFinal"> 
    <properties> 
    <!-- Ignore Rest resources --> 
    <property name="violationSuppressXPath" value=" 
     ./ancestor::ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation/Name 
      [@Image='GET' or @Image='POST' or @Image='PUT' or @Image='DELETE']" /> 
    </properties> 
</rule>