2012-04-02 6 views
5

Tôi đang sửa đổi mã ứng dụng của mình để tôn trọng các quy tắc pmd. Tôi đã có một lỗi Resource Đóng trong mã này:Làm cách nào để tránh vi phạm 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; 
} 

Vì vậy, tôi đã tìm kiếm và tìm thấy một tiện ích apache để tránh nó: DButils Mã của tôi trở nên như thế này

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

Tuy nhiên, tôi vẫn đang gặp cảnh báo PMD trong nhật thực và báo cáo sonar! Bạn có bất kỳ ý tưởng làm thế nào để sửa chữa vĩnh viễn?

Trả lời

0

Vấn đề là PMD không biết closeQuietly() đóng kết nối. Và nó không phải là thông minh bởi vì nếu phương pháp của bạn được đặt tên gần() bạn sẽ có cùng một vấn đề. Và vì nó là một quy tắc Java, nó không phải là dễ dàng để thay đổi việc thực hiện bởi vì sau đó bạn sẽ phải đóng gói lại các trình bổ sung Eclipse và Sonar PMD để nhận ra bản sao của quy tắc.

Tùy chọn của bạn: 1) Thêm // nhận xét NOPMD để chặn 2) Tái cấu trúc mã để nhận/đóng kết nối trong siêu lớp để bạn chỉ có một lần.

0

PMD xác định thông số cho quy tắc này được gọi là closeTargets. Theo mặc định, thông số này được đặt thành phương thức close. Bạn có thể thay đổi nó để chỉ định DbUtils.closeQuietly

2

Bạn có thể đặt thuộc tính closeTargets của quy tắc PMD CloseResource. Khi PMD thấy tên phương pháp tương tự như trong closeTargets tài sản, nó sẽ không bắn thông điệp cảnh báo:

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

Ngoài ra, bạn có thể sử dụng SourceMeter, trong đó bao gồm cấu hình này natively.