我正在修改我的应用程序代码以尊重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警报!你知道如何永久修复它吗?
答案 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