【问题标题】:How do I avoid a PMD CloseResource violation?如何避免 PMD CloseResource 违规?
【发布时间】:2016-04-27 00:45:28
【问题描述】:

我正在修改我的应用程序代码以遵守 pmd 规则。我在这段代码中有一个关闭资源错误:

Connection c = DataSourceUtils.getConnection(dataSource);
Statement request = null;
try {
    request = c.createStatement();
    request.execute(loadDataRequest);
} catch (SQLException e) {
    dataLogger.error(e);
    throw e;
}

所以我搜索并找到了一个避免它的 apache 实用程序:DButils 我的代码变成了这样

Connection c = DataSourceUtils.getConnection(dataSource);
Statement request = null;
try {
    request = c.createStatement();
    request.execute(loadDataRequest);
} catch (SQLException e) {
    dataLogger.error(e);
    throw e;
} finally {
    DbUtils.closeQuietly(request);
    DbUtils.closeQuietly(c);            
}

但是,我仍然在日食和声纳报告中收到 PMD 警报!你知道如何永久解决这个问题吗?

【问题讨论】:

    标签: pmd


    【解决方案1】:

    您可以设置 CloseResource PMD 规则的 closeTargets 属性。当 PMD 发现与 closeTargets 属性中相似的方法名称时,它不会触发警告消息:

    <properties>
        <property name="types" value="Connection,Statement,ResultSet"/>
        <property name="closeTargets" value="closeQuietly, closeConnection, close"/>
    </properties>
    

    或者,您可以使用SourceMeter,它本机包含此配置。

    【讨论】:

      【解决方案2】:

      问题是 PMD 不知道 closeQuietly() 关闭连接。而且它不是那么聪明,因为如果你的方法被命名为 close() 你会有同样的问题。由于它是 Java 规则,因此更改实现并不容易,因为您必须重新打包 Eclipse 和 Sonar PMD 插件才能识别您的规则副本。

      您的选择: 1) 添加 //NOPMD 注释以抑制 2) 重构代码以获取/关闭超类中的连接,因此您只有一次。

      【讨论】:

        【解决方案3】:

        PMD 为此规则定义了一个名为closeTargets 的参数。默认情况下,此参数设置为close 方法。您可以更改它以指定DbUtils.closeQuietly

        【讨论】:

          猜你喜欢
          • 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
          相关资源
          最近更新 更多