Patrząc na BeanPropertyRowMapper
realizacji, sposób ustawia pola to:
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);
}
gdzie getColumnValue(rs, index, pd);
delegaci do JdbcUtils.getResultSetValue
To pd
pola w getColumnValue
jest rzeczywista "p roperty d escriptor ", który jest używany (pd.getPropertyType()
) w JdbcUtils
jako typ pola do odwzorowania na.
Jeśli spojrzeć na kod JdbcUtils
dla getResultSetValue
metody, zobaczysz, że po prostu idzie z jednego if
rachunku do innego, aby dopasować pd.getPropertyType()
do wszystkich standardowych typów. Gdy nie znajdziesz, ponieważ DateTime
nie jest „standard” typ, opiera się ona na rs.getObject()
:
} else {
// Some unknown type desired -> rely on getObject.
Następnie, jeśli ten obiekt jest data SQL konwertuje go do Timestamp
i zwraca się ustawić do pola DateTime
Twojej domeny => w przypadku niepowodzenia.
Stąd, nie wydaje się być prosta droga do wstrzyknąć Date
/Timestamp
do DateTime
konwerter do BeanPropertyRowMapper
. Byłoby więc czystsze (i bardziej wydajne), aby zaimplementować własną aplikację RowMapper.
Jeśli chcesz zobaczyć błąd mapowania w konsoli, ustaw poziom logowania na org.springframework.jdbc
na "debugowanie" lub jeszcze lepiej "śledź", aby zobaczyć dokładnie, co się stanie.
Jedno można spróbować, które nie zostały przetestowane, to rozszerzyć BeanPropertyRowMapper
i zastąpić właściwość DateTime
typu w:
/**
* 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) {}
Dokładnie tego szukam. Jednak dla mnie to naprawdę nie działa. Wykonanie zatrzymuje się w momencie, w którym następuje odwzorowanie DateTime, ale nie zarejestrowano błędów: 'DEBUG: com.keype.hawk.system.jdbc.support.HawkBeanPropertyRowMapper [mapRow]: Odwzorowanie kolumny 'date_added' na właściwość 'dateAdded' typu class org. joda.time.DateTime' –
W końcu udało się rozwiązać problem. Komenda setValue() jest wywoływana z obiektem TimeStamp jako parametrem, ale w rzeczywistości jest to JodaTime Per my logger: 'Un supported object 2011-10-12 00: 00: 00.0. Typ obiektu: java.sql.Timestamp. Expected DateTime' –
@firdousamir ok, zmieniłem kod teraz. Wypróbuj tę wersję. –