Guardando BeanPropertyRowMapper
implementazione, il modo in cui definisce i campi è:
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);
}
dove getColumnValue(rs, index, pd);
delegati per JdbcUtils.getResultSetValue
Che pd
campo nella getColumnValue
è il vero e proprio "p ROPRIETÀ d escriptor ", che viene utilizzato (pd.getPropertyType()
) in JdbcUtils
come tipo del campo su cui mappare.
Se si guarda JdbcUtils
codice per getResultSetValue
metodo, vedrai che va semplicemente da una dichiarazione if
ad un altro, per abbinare pd.getPropertyType()
a tutti i tipi standard. Quando non trova uno, dal momento che DateTime
non è un tipo di "standard", si basa su un rs.getObject()
:
} else {
// Some unknown type desired -> rely on getObject.
Allora, se questo oggetto è un Data SQL si converte in un Timestamp
, e restituisce da impostare a un campo DateTime
del tuo dominio => dove non riesce.
Quindi, non sembra essere un modo dritto in avanti per iniettare un convertitore Date
/Timestamp
a DateTime
in un BeanPropertyRowMapper
. Quindi sarebbe più pulito (e più performante) implementare il tuo RowMapper.
Nel caso in cui si desideri visualizzare l'errore di associazione in una console, impostare il livello di registrazione per org.springframework.jdbc
su "debug" o meglio ancora "traccia" per vedere esattamente cosa succede.
Una cosa si può provare, che non ho ancora testato, è quello di estendere un BeanPropertyRowMapper
e sovrascrivere una proprietà di DateTime
digitare:
/**
* 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) {}
Questo è esattamente quello che sto cercando. Tuttavia, non funziona davvero per me. L'esecuzione si interrompe nel momento in cui si verifica un mapping DateTime, tuttavia non vengono registrati errori: 'DEBUG: com.keype.hawk.system.jdbc.support.HawkBeanPropertyRowMapper [mapRow]: Mappatura della colonna 'date_added' alla proprietà 'dateAdded' di tipo class org. joda.time.DateTime' –
Finalmente riuscito all'area problematica. setValue() viene chiamato con un oggetto TimeStamp come parametro, ma in realtà è un JodaTime Per il mio logger: 'Un oggetto supportato 2011-10-12 00: 00: 00.0. Tipo di oggetto: java.sql.Timestamp. Expected DateTime' –
@firdousamir ok, ho cambiato il codice ora. Prova questa versione. –