java - ElasticSearch 日期转换为 Java LocalDateTime 失败
问题描述
我有一个从 ElasticSearch 索引中读取数据并进行处理的微服务。该索引有一个日期字段,我无法将日期字段数据加载到文档实体中。这是我正在尝试实现的快照。
指数
"date_created": {
"type": "date"
}
将日期存储为
"date_created": "2015-07-02T14:56:51.000Z"
我的实体类
@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;
...
}
在运行时从 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
有没有办法解决这个问题?我将尝试如下更改索引定义和 JsonFormat,但我不确定这是否可行。我提前询问是因为我需要时间来实施索引的更改。
索引更改我稍后会尝试。
"date_created": {
"type": "date",
"format": "yyyy-MM-dd'T'HH:mm:ss.SSS"
}
json格式改变
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
非常感谢您的帮助。
解决方案
我如上所述重新创建了索引。但是,在创建索引后,logstash 开始无法在索引中抽取数据。在流内修复数据可能代价高昂。因此,我恢复到原始索引。
什么真正解决了我的问题?我对@JsonFormat 的模式做了一个小的改变,它成功了。
前
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
后
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
因此,基本上返回的日期中的“Z”是一个字符,而不是日期格式化程序。使用单引号,我告诉格式化程序将其视为字符而不是格式字符串。
希望这可以解决其他人的困惑。
推荐阅读
- macos - 为什么 Flutter Doctor 和 Flutter run 需要 50 分钟才能完成输出?
- automation - 捕获从网页弹出的对象 - Automation Anywhere
- vue.js - 如何处理 Vue 渐进式 Web 应用程序
- ios - GetStream 获取活动正在获取所有活动而不是特定 ID
- selenium - 使用和不使用 Actions 类的 build() 方法的键盘和鼠标交互
- kubernetes - 如何在特定节点 Kubernetes 上更改 PODcidr
- jquery - 从顶部为小吃店设置动画
- javascript - 点击后如何清除传单层
- java - ObjectMapper 反序列化的特定第三方字段
- excel - 如何从另一列的值中删除部分文本字符串?