PMD - 跳过@PostConstruct或@PreDestroy

时间:2017-12-14 14:41:22

标签: java pmd

我有以下课程:

import javax.annotation.PostConstruct;

public class PmdUnusedMethod {

    private void unusedMethod() {
    }

    @PostConstruct
    private void postConstructAnnotatedMethod() {
    }
}

并定义了PMD规则集:

<rule ref="rulesets/java/unusedcode.xml"/>

在这种情况下,PMD报告了两个关于未使用方法的错误(“unusedMethod”和“postConstructAnnotatedMethod”),但我想忽略使用@PreDestroy和@PostConstruct注释的方法的规则“UnusedPrivateMethod”。

我知道我可以这样做:

<rule ref="rulesets/java/unusedcode.xml">
        <exclude name="UnusedPrivateMethod"/>
    </rule>
    <rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod">
        <properties>
            <property name="violationSuppressXPath"
                      value="//ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation/Name[@Image='PostConstruct']"/>
        </properties>
    </rule>

但在这种情况下,PMD跳过检查此规则,因为类中的所有方法都包含我的注释,不仅适用于使用@PostConstruct注释的方法。我希望在检查代码后,我的“unusedMethod”只有错误,PMD不会通知有关“postConstructAnnotatedMethod”的错误。

我想做这样的事情:

<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod">
    <properties>
        <property name="violationSuppressXPath"
                  value="//MethodDeclaration/Annotation/Name[@Image='PostConstruct']"/>
    </properties>
</rule>

仅跳过使用所需注释注释的方法,而不是所有方法。

此外,我不想使用许多@SuppressWarnings("PMD.UnusedPrivateMethod")注释来污染我的代码。

1 个答案:

答案 0 :(得分:0)

执行抑制XPath是以违规所在的节点为起点执行的,因此您可以简单地转到方法,并检查注释&#34;。

例如:

<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod">
    <properties>
        <property name="violationSuppressXPath"
                  value="./ancestor::ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation/Name[@Image='PostConstruct']"/>
    </properties>
</rule>