在某些 类 中抑制 PMD 违规

Suppress PMD violation in certain classes

我有 ViewState POJO classes,它的构造函数有很多参数。问题是 PMD 正在向他们抛出 ExcessiveParameterList 违规行为。

现在,我正在尝试抑制所有以 ViewState.java 结尾的 class 的违规行为(例如 DashboardViewState.java)。我已经添加 这对我的 rules-pmd.xml:

<rule ref="category/java/design.xml/ExcessiveParameterList">
    <properties>
        <!--Ignore ExcessiveParameterList on ViewState classes -->
        <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration['*ViewState.java']"/>
    </properties>
</rule>

问题是,这将禁止所有违反 ExcessiveParameterList 的行为,无论在 class 中。我做错了什么?

这是 this question 的副本,但由于没有人赞成我的回答,我无法将其标记为重复。

请参阅 详细了解为什么您的表达式禁止所有违反规则的行为。

这里的解决方案是测试ClassOrInterfaceDeclaration的@Image属性,不是使用//,而是ancestor检查:

./ancestor::ClassOrInterfaceDeclaration[contains(@Image, 'ViewState')]

XPath 1.0 不支持正则表达式,因此您只能像此处那样进行 contains 检查,或者使用 substring 模仿 ends-with 函数,如 this answer