En cuanto a BeanPropertyRowMapper
aplicación, la forma de establecer los campos es:
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);
}
donde getColumnValue(rs, index, pd);
delegados a JdbcUtils.getResultSetValue
Eso pd
campo en getColumnValue
es el verdadero "p ROPIEDAD d escriptor ", que se utiliza (pd.getPropertyType()
) en JdbcUtils
como tipo del campo para mapear.
Si nos fijamos en JdbcUtils
código para getResultSetValue
método, verá que simplemente va de un if
comunicado a otro, para que coincida con pd.getPropertyType()
a todos los tipos estándar. Cuando no encuentra uno, ya DateTime
no es un tipo "estándar", se basa en un rs.getObject()
:
} else {
// Some unknown type desired -> rely on getObject.
Entonces, si este objeto es una Fecha de SQL se convierte en una Timestamp
, y vuelve a ser establecido a un campo DateTime
de su dominio => donde falla.
Por lo tanto, no parece ser una manera directa para inyectar un convertidor Date
/Timestamp
a DateTime
en un BeanPropertyRowMapper
. Por lo tanto, sería más limpio (y más eficiente) implementar su propio RowMapper.
En caso de que desee ver el error de asignación en una consola, configure su nivel de registro para org.springframework.jdbc
para "depurar" o mejor aún para "rastrear" para ver exactamente qué sucede.
Una cosa que usted puede intentar, que no he probado, es extender una BeanPropertyRowMapper
y sustituir una propiedad de DateTime
escriba:
/**
* 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) {}
Esto es exactamente lo que estoy buscando. Sin embargo, en realidad no está funcionando para mí. La ejecución se detiene en el momento en que ocurre un mapeo DateTime, sin embargo, no hay errores registrados: 'DEBUG: com.keype.hawk.system.jdbc.support.HawkBeanPropertyRowMapper [mapRow]: columna de mapeo 'date_added' a la propiedad 'fechaAdded' de tipo clase org. joda.time.DateTime' –
Finalmente se dirigió al área problemática. setValue() se llama con un objeto TimeStamp como parámetro, pero en realidad es un JodaTime Per my logger: 'Un objeto compatible 2011-10-12 00: 00: 00.0. Tipo de objeto: java.sql.Timestamp. Fecha prevista ' –
@firdousamir bien, he cambiado el código ahora. Prueba esta versión. –