如何避免PMD CloseResource违规?

时间:2012-04-02 09:11:24

标签: pmd

我正在修改我的应用程序代码以尊重pmd规则。我在此代码中遇到了Close Resource错误:

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警报!你知道如何永久修复它吗?

3 个答案:

答案 0 :(得分:2)

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

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

或者,您可以使用SourceMeter,其中包含此配置。

答案 1 :(得分:0)

问题是PMD不知道closeQuietly()会关闭连接。并不是那么聪明,因为如果你的方法被命名为close()你就会遇到同样的问题。由于它是一个Java规则,因此您不得不重新打包Eclipse和Sonar PMD插件以识别您的规则副本。

您的选择: 1)添加// NOPMD注释以禁止 2)重构代码以获取/关闭超类中的连接,这样你只需要一次。

答案 2 :(得分:0)

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