我目前正在从Spring Data Elasticsearch 3.2.x迁移到4.0.0。
我正在删除定义了自定义JacksonEntityMapper
的ZonedDateTimeDeserializer
以使用ElasticsearchEntityMapper
我有一个ZonedDateTime字段,定义如下:
@Field(type = Date, format = DateFormat.date_time)
private final ZonedDateTime loggedIn;
但是,反序列化会丢失区域信息,因此存储之前和之后的字段之间的比较失败:
之前
loggedIn=2020-06-01T09:50:27.389589+01:00[Europe/London]
之后
loggedIn=2020-06-01T09:50:27.389+01:00
我希望仅存储时区偏移量,所以会丢失区域信息。使用Jackson ZonedDateTimeDeserializer
,我能够在ZonedDateTime构造期间应用区域。
理想情况下,我想定义一个自定义日期格式和转换器类来处理我的情况。
我尝试了以下字段配置:
@Field(type = Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ")
private final ZonedDateTime loggedIn;
具有阅读/书写转换器
@WritingConverter
public class ZonedDateTimeToStringConverter implements Converter<ZonedDateTime, String> {
@Override
public String convert(ZonedDateTime source) {
return source.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
}
@ReadingConverter
public class StringToZonedDateTimeConverter implements Converter<String, ZonedDateTime> {
@Override
public ZonedDateTime convert(String source) {
return ZonedDateTime.parse(source, DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.systemDefault()));
}
}
和配置
public class ElasticConfiguration extends AbstractElasticsearchConfiguration {
@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
return new ElasticsearchCustomConversions(List.of(new ZonedDateTimeToStringConverter(),
new StringToZonedDateTimeConverter()));
}
}
但是,该字段的读取因异常而失败
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {YearOfEra=2020, MonthOfYear=8, DayOfMonth=20, OffsetSeconds=3600},ISO resolved to 11:11:11.123 of type java.time.format.Parsed
at java.base/java.time.LocalDate.from(LocalDate.java:396)
at java.base/java.time.ZonedDateTime.from(ZonedDateTime.java:560)
at org.springframework.data.elasticsearch.core.convert.ElasticsearchDateConverter.parse(ElasticsearchDateConverter.java:109)
at org.springframework.data.elasticsearch.core.convert.ElasticsearchDateConverter.parse(ElasticsearchDateConverter.java:114)
...
[查看异常,将解析与成功的DateFormat.date_time
读取进行比较时,我的模式可能有错误。 DateFormat.date_time
的TemporalAccessor是{OffsetSeconds=3600, InstantSeconds=1597918271},ISO resolved to 2020-08-20T11:11:11.123
,而我的自定义模式解析为{YearOfEra=2020, MonthOfYear=8, DayOfMonth=20, OffsetSeconds=3600},ISO resolved to 11:11:11.123
但是似乎我指定的自定义转换器也没有被使用。注意。我指定了其他正在接受的客户转换器,所以请不要相信这是配置问题。
可以提供任何帮助,我不确定自定义模式为何会失败,但是如果选择了自定义转换器,我想我可以避免它。我现在可以解决该问题,但理想情况下,我希望升级前后一切都保持一致。
不要在日期模式中使用yyyy,将其更改为(请参见the Elasticsearch docs)
pattern = "uuuu-MM-dd'T'HH:mm:ss.SSSSSSZ")
通过在内部将属性定义为FieldType.Date
,将为此属性创建一个转换器并使用;不需要自定义转换器