I use spring-cloud-gcp-data-spanner
for fetching data from GCP Spanner. One of my tables contains the TIMESTAMP column, which contains date-time in UTC.
Spring Data Cloud Data already has some default Spanner converters for some custom types. My entity class maps TIMESTAMP (com.google.cloud.Timestamp
) column to LocalDateTime.
It uses default TIMESTAMP_LOCAL_DATE_TIME_CONVERTER and converts date-time according to my local zone (UTC+3). I added my custom converter and specified it using ConverterAwareMappingSpannerEntityProcessor
, but my custom converter isn't used and appears at the end of the converters list (GenericConversionService#converters).
public class LocalDateTimeReadConverter implements Converter<com.google.cloud.Timestamp, LocalDateTime> {
@Nullable
@Override
public LocalDateTime convert(com.google.cloud.Timestamp timestamp) {
return Instant
.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos())
.atZone(ZoneId.of("UTC"))
.toLocalDateTime();
}
}
@Bean
public SpannerEntityProcessor spannerConverter(SpannerMappingContext mappingContext) {
return new ConverterAwareMappingSpannerEntityProcessor(mappingContext,
List.of(new LocalDateTimeWriteConverter()),
List.of(new LocalDateTimeReadConverter()));
}
DB value: 2020-06-18T15:55:09.000Z
Actual value: 2020-06-18T18:55:09.000Z
Expected value: 2020-06-18T15:55:09.000Z
How can I override a default Spanner converter?
This was resolved by https://github.com/spring-cloud/spring-cloud-gcp/pull/2580 which is a fix made by Dmitry S as they mentioned in their deleted answer.