Глядя на реализацию BeanPropertyRowMapper
, она устанавливает поля следующим образом:
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);
}
, где getColumnValue(rs, index, pd);
делегирует JdbcUtils.getResultSetValue
То, что pd
поле в getColumnValue
является фактическим " p roperty d escriptor", которое используется (pd.getPropertyType()
) в JdbcUtils
как введите поля для сопоставления.
Если вы посмотрите на код JdbcUtils
для метода getResultSetValue
, вы увидите, что он просто переходит от одного оператора if
к другому, чтобы сопоставить pd.getPropertyType()
со всеми стандартными типами. Когда он не находит его, поскольку DateTime
не является «стандартным» типом, он опирается на rs.getObject()
:
} else {
// Some unknown type desired -> rely on getObject.
Затем, если этот объект является датой SQL, он преобразует его в Timestamp
и возвращает для установки в поле DateTime
вашего домена =>, где происходит сбой.
Следовательно, кажется, что нет прямого способа ввести преобразователь Date
/ Timestamp
в DateTime
в BeanPropertyRowMapper
. Так что было бы чище (и более эффективно) реализовать свой собственный RowMapper.
Если вы хотите увидеть ошибку сопоставления в консоли, установите для уровня ведения журнала для org.springframework.jdbc
значение «отладка» или, что еще лучше, «трассировка», чтобы точно увидеть, что происходит.
Одна вещь, которую вы можете попробовать, которую я не проверял, - это расширение BeanPropertyRowMapper
и переопределение свойства DateTime
типа:
/**
* 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) {}