【问题标题】:Setting XPath violation suppressions in PMD在 PMD 中设置 XPath 违规抑制
【发布时间】:2021-03-03 16:12:51
【问题描述】:

我正在 PMD 中设置自定义规则,但在不使用已弃用功能的情况下,我无法让 XPath 抑制正常工作。我正在使用 PMD 6.32。

我的规则是修改Java/Codestyle规则集中的规则ShortVariable

<rule ref="category/java/codestyle.xml/ShortVariable">
        <properties>
            <!-- ignore ID -->
            <property name="violationSuppressXPath" value="//VariableDeclaratorId[@Image='id']"/>
        </properties>
    </rule>

我遇到了两个问题:

  1. 当我运行检查时,我在日志中得到以下信息: java.lang.RuntimeException: Use of deprecated attribute 'VariableDeclaratorId/@Image' in a findChildNodesWithXPath navigation, please use @Name instead。但是,当我将 @Image 的任何实例更改为 @Name 时,检查将失败。
  2. 这个特殊的规则没有像我希望的那样起作用。我想保留原始规则,但如果字段名称为id,则禁止它。相反,如果有一个名为id 的字段,它会抑制类中所有变量的规则。规则应该是什么?

编辑 使用以下方法解决了 id 规则未正确应用的问题: &lt;property name="violationSuppressXPath" value="./.[@Name='id']"/&gt;

但是,在将 @Image 的实例更改为 @Name 之后,根本没有应用其他一些抑制:

&lt;property name="violationSuppressXPath" value="./MethodDeclarator[@Name='hashCode' or @Name='equals']"/&gt; 应该禁止对方法名称 hashCodeequals 的规则,但不是

&lt;property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Interface='true' and (ends-with(@Name, 'Repository'))]"/&gt; 应该禁止对名称以 Repository 结尾的类中的方法的规则,但不是

&lt;property name="violationSuppressXPath" value="//MethodDeclarator[@Name='main']"/&gt; 应该抑制主方法中方法的规则,但正在抑制其他方法和应用程序类的规则

【问题讨论】:

    标签: xpath pmd


    【解决方案1】:

    至于你的问题:

    1. 替换是正确的,除了deprecation之外没有任何区别,其实the code reads
        /**
         * @deprecated Use {@link #getName()}
         * @return
         */
        @Override
        @DeprecatedAttribute(replaceWith = "@Name")
        @Deprecated
        public String getImage() {
            return getName();
        }
    
        /** Returns the name of the variable. */
        public String getName() {
            return super.getImage();
        }
    
    1. 根据the documentation on XPath suppression:

    注意使用. 来指代上下文节点。应避免在表达式开头使用//,因为它会测试文件中的所有节点,并抑制比预期更多的违规行为。

    所以你应该只使用:

    <property name="violationSuppressXPath" value=".[@Name='id']"/>
    

    【讨论】:

    • 使用 &lt;property name="violationSuppressXPath" value="./[@Name='id']"/&gt; 给我一个运行时异常:org.jaxen.saxpath.XPathSyntaxException: ./[@Name='id']: 2: Expected one of '.', '..', '@', '*', &lt;QName&gt;
    • 我已经用"./.[@Name='id']" 解决了这个问题,但是在将它们转换为使用@Name 之后,我现在遇到了其他规则失败的问题。我会用新问题更新我最初的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多