Nhìn vào BeanPropertyRowMapper
thực hiện, cách thức mà nó thiết lập các lĩnh vực là:
Object value = getColumnValue(rs, index, pd);
if (logger.isDebugEnabled() && rowNumber == 0) {
logger.debug("Mapping column '" + column + "' to property '" +
pd.getName() + "' of type " + pd.getPropertyType());
}
try {
bw.setPropertyValue(pd.getName(), value);
}
nơi getColumnValue(rs, index, pd);
đại biểu JdbcUtils.getResultSetValue
Đó pd
trường trong getColumnValue
là thực tế "p roperty d escriptor ", được sử dụng (pd.getPropertyType()
) trong JdbcUtils
dưới dạng loại của trường để ánh xạ tới.
Nếu bạn xem mã JdbcUtils
cho phương thức getResultSetValue
, bạn sẽ thấy rằng nó chỉ đơn giản là từ một câu lệnh if
đến câu khác, để đối sánh pd.getPropertyType()
với tất cả các loại tiêu chuẩn. Khi nó không tìm thấy một, vì DateTime
không phải là "tiêu chuẩn" loại, nó dựa trên một rs.getObject()
:
} else {
// Some unknown type desired -> rely on getObject.
Sau đó, nếu đối tượng này là một ngày SQL nó chuyển đổi nó vào một Timestamp
, và trả về được thiết lập vào trường DateTime
trong miền của bạn => nơi không thành công.
Do đó, dường như không có cách nào để chuyển tiếp một cách thẳng thắn để chèn một hình ảnh Date
/Timestamp
tới DateTime
chuyển đổi thành BeanPropertyRowMapper
. Vì vậy, nó sẽ được sạch hơn (và nhiều hơn nữa) để thực hiện RowMapper của riêng bạn.
Trong trường hợp bạn muốn xem lỗi ánh xạ trong bảng điều khiển, hãy đặt mức nhật ký của bạn cho org.springframework.jdbc
thành "gỡ lỗi" hoặc "dấu vết" tốt hơn để xem chính xác điều gì xảy ra.
Một điều bạn có thể thử, mà tôi đã không kiểm tra, là mở rộng một BeanPropertyRowMapper
và ghi đè lên một tài sản của DateTime
gõ:
/**
* Initialize the given BeanWrapper to be used for row mapping.
* To be called for each row.
* <p>The default implementation is empty. Can be overridden in subclasses.
* @param bw the BeanWrapper to initialize
*/
protected void initBeanWrapper(BeanWrapper bw) {}
Đây chính xác là những gì tôi đang tìm kiếm. Tuy nhiên, nó không thực sự làm việc cho tôi. Việc thực hiện dừng ngay khi ánh xạ DateTime xảy ra, tuy nhiên không có lỗi nào được ghi lại: 'DEBUG: com.keype.hawk.system.jdbc.support.HawkBeanPropertyRowMapper [mapRow]: Ánh xạ cột 'date_added' đến thuộc tính 'dateAdded' của kiểu lớp org. joda.time.DateTime' –
Cuối cùng là quản lý khu vực sự cố. setValue() được gọi với đối tượng TimeStamp làm tham số, nhưng nó thực sự là một JodaTime Per logger của tôi: 'Un object được hỗ trợ 2011-10-12 00: 00: 00.0. Loại đối tượng: java.sql.Timestamp. Ngày giờ mong đợi ' –
@firdousamir ok, tôi đã thay đổi mã ngay bây giờ. Hãy thử phiên bản này. –