2012-04-02 11 views
5

Estoy modificando el código de mi aplicación para respetar las reglas pmd. Tenía un Cerca de error de recursos en este código:¿Cómo evito una violación 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; 
} 

Así que buscado y encontrado una utilidad Apache para evitarlo: dbUtils Mi código se quedaron como este

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);    
} 

Sin embargo, sigo teniendo ¡la alerta PMD en los informes de eclipse y sonar! ¿Tienes alguna idea de cómo solucionarlo de forma permanente?

Respuesta

0

El problema es que PMD no sabe closeQuietly() cierra la conexión. Y no es tan inteligente porque si tu método se llamara close() tendrías el mismo problema. Y como es una regla de Java, no es fácil cambiar la implementación porque entonces tendría que volver a empaquetar los plugins de PMD de Eclipse y Sonar para reconocer su copia de la regla.

Sus opciones: 1) Agregar // NOPMD comentario para suprimir 2) Refactorizar el código para obtener/cerrar la conexión en una superclase, por lo que solo la tendrá una vez.

0

PMD define un parámetro para esta regla llamada closeTargets. Por defecto, este parámetro está configurado en el método close. Puede cambiarlo para especificar DbUtils.closeQuietly

2

Puede establecer la propiedad closeTargets de la regla CloseResource PMD. Cuando PMD encuentra nombres de métodos similares a los de la propiedad closeTargets, no se disparará el mensaje de advertencia:

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

Como alternativa, puede utilizar SourceMeter, que incluye esta configuración de forma nativa.

Cuestiones relacionadas