ElasticSearch 日期转换为 Java LocalDateTime 失败

Sur*_*aut 4 java elasticsearch spring-data-jpa spring-boot

我有一个微服务,可以从 ElasticSearch 索引读取数据并处理它。该索引有一个日期字段,我无法将日期字段数据加载到文档实体中。这是我正在努力实现的目标的快照。

指数

"date_created": {
  "type": "date"
}
Run Code Online (Sandbox Code Playgroud)

它将日期存储为

"date_created": "2015-07-02T14:56:51.000Z"
Run Code Online (Sandbox Code Playgroud)

我的实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "account", type = "doc")
public class Account implements Serializable {

...

    @JsonProperty("date_created")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime dateCreated;

...

}
Run Code Online (Sandbox Code Playgroud)

当我在运行时从 ElasticSearch 存储库获取记录时出现的错误如下

nested exception is org.springframework.data.elasticsearch.ElasticsearchException: failed to map source ...
java.time.format.DateTimeParseException: Text '2002-08-05T04:00:00.000Z' could not be parsed, unparsed text found at index 23
Run Code Online (Sandbox Code Playgroud)

有什么办法可以解决这个问题吗?我将尝试如下更改索引定义和 JsonFormat,但我不确定这是否有效。我提前询问是因为我需要时间来实施索引的更改。

索引更改我稍后会尝试。

"date_created": {
  "type": "date",
  "format": "yyyy-MM-dd'T'HH:mm:ss.SSS"
}
Run Code Online (Sandbox Code Playgroud)

Json格式改变

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助。

Sur*_*aut 5

我如上所述重新创建了索引。然而,在创建索引后,logstash 开始无法在索引中提取数据。在流中修复数据可能成本高昂。因此我恢复到原来的索引。

是什么真正解决了我的问题?我对 @JsonFormat 的模式做了一个小小的改变,它成功了。

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
Run Code Online (Sandbox Code Playgroud)

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
Run Code Online (Sandbox Code Playgroud)

因此,基本上返回的日期中的“Z”是一个字符,而不是日期格式化程序。使用单引号,我告诉格式化程序将其视为字符而不是格式字符串。

希望这可以解决其他人的困惑。