2012-04-02 157 views
5

我正在修改我的應用程序代碼以遵守pmd規則。我在此代碼關閉資源錯誤:如何避免PMD CloseResource違規?

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

問題是PMD不知道closeQuietly()關閉連接。它並不那麼聰明,因爲如果你的方法被命名爲close(),你會遇到同樣的問題。由於這是一條Java規則,所以改變實現並不容易,因爲那樣你就不得不重新包裝Eclipse和Sonar PMD插件來識別你的規則副本。

您的選擇: 1)添加// NOPMD評論打壓 2)重構代碼獲取/關閉的超連接,所以你只能有一次。

0

PMD爲此規則定義了一個名爲closeTargets的參數。默認情況下,該參數設置爲close方法。您可以更改它以指定DbUtils.closeQuietly

2

您可以設置CloseResource PMD規則的closeTargets屬性。當PMD發現類似的方法名稱作爲closeTargets屬性,則不會觸發警告消息:

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

或者,你可以使用SourceMeter,其中包括該配置本身。