Как избежать нарушения PMD CloseResource? - PullRequest
5 голосов
/ 02 апреля 2012

Я изменяю код своего приложения, чтобы соблюдать правила 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 в отчетах о затмениях и сонарах! У вас есть идеи, как это исправить навсегда?

Ответы [ 3 ]

2 голосов
/ 18 августа 2014

Вы можете установить свойство closeTargets правила PMR CloseResource.Когда PMD находит имена методов, аналогичные описанным в свойстве closeTargets, оно не выдает предупреждающее сообщение:

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

В качестве альтернативы вы можете использовать SourceMeter , который изначально включает эту конфигурацию.

0 голосов
/ 17 апреля 2012

PMD определяет параметр для этого правила, который называется closeTargets. По умолчанию для этого параметра установлено значение close method. Вы можете изменить его для указания DbUtils.closeQuietly

0 голосов
/ 08 апреля 2012

Проблема в том, что PMD не знает closeQuietly () закрывает соединение. И это не так умно, потому что если бы ваш метод был назван close (), у вас возникла бы та же проблема. А поскольку это правило Java, изменить реализацию нелегко, потому что тогда вам придется перепаковать плагины Eclipse и Sonar PMD, чтобы распознать вашу копию правила.

Ваши варианты: 1) Добавить // комментарий NOPMD для подавления 2) Измените код, чтобы получить / закрыть соединение в суперклассе, чтобы оно было у вас только один раз.

...