Spring Data OpenSearch 无法将 @Timestamp 的值转换为 Java Instant

问题描述 投票:0回答:1

嗨,我的开放搜索索引中有一个字段

@timestamp
,它看起来像文档中的 JSON:
“@timestamp”: “2024-06-03T20:31:06.40402165Z”,
。我尝试在 spring data opensearch 文档记录中使用以下字段检索值:

@Field(name = "@timestamp" type = FieldType.Date) Instant atTimestamp,

但我收到以下错误:

2024-06-14 14:13:47 org.springframework.data.elasticsearch.core.convert.ConversionException: Unable to convert value '2024-06-03T20:30:17.058647704Z' to java.time.Instant for property 'atTimestamp'

为了解决这个问题,我尝试向字段添加一个模式,如下所示:

pattern = "YYYY-MM-DDThh:mm:ss.sssssssssZ
,但他给出了以下错误:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'auditLogRepository' defined in com.my.java.project defined in @EnableElasticsearchRepositories declared on OpenSearchConfig: Too many pattern letters: s

所以我尝试使用 DateFormat 添加格式:

format = {
   DateFormat.date_time_no_millis,
   DateFormat.strict_date_optional_time_nanos,
   DateFormat.date_optional_time,
   DateFormat.epoch_millis
 })

但这只是给出了最初的错误。现在我只是在墙上扔图案,然后跳一些东西粘在上面,但似乎没有任何作用。 这是我迄今为止尝试过的:

  @Field(
             name = "@timestamp",
             type = FieldType.Date,
             pattern = {
               "uuuu-MM-dd['T'HH:mm:ss.SSSSSSXXX]",
               "uuuu-MM-dd['T'HH:mm:ss.SSSSSSXXXZ]",
               "uuuu-MM-dd['T'HH:mm:ss.SSSSSSXXXZD]",
               "uuuu-MM-dd['T'HH:mm:ss.SSSSSSXXX]Z",
               "YYYY-MM-DD'T'HH:mm:ss.SSSSSSXXXZ",
               "yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXXZ",
               "yyyy-MM-dd'T'HH:mm:ss.SSSXXX",
               "yyyy-MM-dd'T'HH:mm:ss.SSSXXXZ",
               "yyyy-MM-dd'T'HH:mm:ss.SSSXXXZD",
               "YYYY-MM-DD'T'hh:mm:ss,s'T'ZD",
               "YYYY-MM-DD['T'hh:mm:ss.SSSSSSXXXZ]",
               "YYYY-MM-DD['T'hh:mm:ss.SSSSSSXXXZD]",
               "YYYY-MM-DD['T'hh:mm:ss.SSSSSSXXX]Z",
               "YYYY-MM-DD['T'hh:mm:ss.SSSSSSXXX]ZD",
               "uuuu-MM-dd['T'HH:mm:ss.SSSSSSXXX]ZD"
             })
         Instant atTimestamp,

有谁知道我应该如何正确转换它?感谢您提前提供帮助

java spring spring-data spring-data-elasticsearch opensearch
1个回答
0
投票

我认为你想要的格式是

uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSX

这是一个通过的测试:

    @Test
    @DisplayName("should convert nanos")
    void shouldConvertNanos() {
        ElasticsearchDateConverter converter = ElasticsearchDateConverter.of("uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSX");
        LocalDateTime parsed = converter.parse("2024-06-03T20:30:17.058647704Z", LocalDateTime.class);

        assertThat(parsed).isEqualTo(LocalDateTime.of(2024, 6, 3, 20,30, 17, 58647704));
    }
© www.soinside.com 2019 - 2024. All rights reserved.