将 ZonedDateTime 与 Spring Boot 和 OpenSearch 结合使用

Using ZonedDateTime with Spring Boot and OpenSearch

提问人:NecmiK 提问时间:11/13/2023 最后编辑:NecmiK 更新时间:11/13/2023 访问量:32

问:

我正在使用 Spring Boot 3.1.2 和 Spring Data Open Search Starter (spring-data-opensearch-starter) 1.2.0 库来保存和读取我的实体/从弹性搜索到弹性搜索。

我的实体的字段类型之一是 ZonedDateTime:

@Builder
@Document(indexName = "orders", writeTypeHint = WriteTypeHint.FALSE)
public class OrderModel {
    @Id
    private String orderId;

    @Field(type = FieldType.Date, pattern = "uuuu-MM-dd'T'HH:mm:ss.SSS", format = {})
    private ZonedDateTime orderDate;

    private String store;
}

我的存储库扩展了 ElasticsearchRepository:

@Repository
public interface OrderRepository extends ElasticsearchRepository<OrderModel, String> {
}

当我保存我的实体时,我可以看到它已成功保存到弹性搜索:

"_index": "orders",
        "_id": "9202107589",
        "_score": 1,
        "_source": {
          "orderId": "9202107589",
          "placedDate": "2023-10-23T21:05:37.263",
          "store": “ZARA” 
         }

但是,当我通过调用 orderRepository.existsById(orderId) 读取它时,它会抛出以下转换错误:

org.springframework.data.elasticsearch.core.convert.ConversionException: Unable to convert value '2023-10-23T21:05:37.263' to java.time.ZonedDateTime for property 'orderDate' at org.springframework.data.elasticsearch.core.convert.TemporalPropertyValueConverter.read(TemporalPropertyValueConverter.java:60)
    at org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter$Reader.convertOnRead(MappingElasticsearchConverter.java:531)

有什么想法可以解决这个问题吗?

尝试创建自定义转换器,但失败。

spring-boot opensearch zoneddatetime

评论

0赞 Jesper 11/13/2023
这可能是因为字符串中没有时区信息,因此没有足够的信息来创建(即日期 + 时间 + 时区)。请改用,或确保字符串中有时区偏移量或时区 ID。ZonedDateTimeLocalDateTime
1赞 NecmiK 11/13/2023
@Jesper 我映射的源数据是 ZoneDateTime。所以,我认为保持类型相同会很好。我知道这是UTC时区。如果我将字段类型更改为 LocalDateTime,我只需要将其从 ZonedDateTime 转换为 LocalDateTime,对吗?
0赞 Jesper 11/16/2023
我不明白你在问什么,但是是的,你可以通过调用 .但是,为什么不以包含时区的格式写入 JSON?例如ZonedDateTimeLocalDateTimetoLocalDateTime()ZonedDateTimeZonedDateTime2023-10-23T21:05:37.263+01:00
0赞 NecmiK 11/17/2023
@Jesper这是因为该对象来自第三方。奇怪的是他们没有添加它。正如你所建议的,我将其转换为 LocalDateTime。

答: 暂无答案