英文:
Unable to obtain Instant from TemporalAccessor: {},ISO resolved to 2018-01-01 of type java.time.format.Parsed
问题
我已经创建了一个具有以下映射的 Elasticsearch(版本 7.8.1)文档:
{
"transaction": {
"mappings": {
"properties": {
"_class": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"settlementEntries": {
"type": "nested",
"properties": {
"settlementDate": {
"type": "date",
"format": "uuuu-MM-dd"
},
"settlementId": {
"type": "long"
}
}
},
"transactionId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
我正在使用 yyyy-MM-dd 格式来存储 settlementDate。当我使用 CURL -X GET localhost:9200/transaction/_search
进行查询时,我能够看到数据。但是,当我尝试通过 Spring Boot 进行相同操作时,出现错误。我的实体类如下:
public class TransactionBo {
@Id
private String transactionId;
@Field(type = FieldType.Nested)
private SettlementEntryBo settlementEntries;
}
public class SettlementEntryBo {
@Id
private Long settlementId;
@Nullable
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd")
private Date settlementDate;
}
从我所能理解的情况来看,问题可能出现在以下映射部分:
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd")
private Date settlementDate;
[错误片段]:
2020-09-05 02:51:18.105 ERROR 10080 --- [nio-8090-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {}, ISO resolved to 2016-01-01 of type java.time.format.Parsed] with root cause
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: InstantSeconds
英文:
I've made a Elasticsearch(version 7.8.1) document with the following mappings:
{
"transaction": {
"mappings": {
"properties": {
"_class": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"settlementEntries": {
"type": "nested",
"properties": {
"settlementDate": {
"type" : "date",
"format" : "uuuu-MM-dd"
},
"settlementId": {
"type": "long"
}
}
},
"transactionId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
I'm using the format yyyy-MM-dd to store settlementDate. When I'm querying using using curl, I' able to see the data using CURL -X GET localhost:9200/transaction/_search
. But, when I'm trying to do the same via springboot it's throwing an error.My entities are:
public class TransactionBo {
@Id
private String transactionId;
@Field(type = FieldType.Nested)
private SettlementEntryBo settlementEntries;
}
and
public class SettlementEntryBo {
@Id
private Long settlementId;
@Nullable
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd")
private Date settlementDate;
}
From what I can figure out the issue lies in the mapping here:
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd")
private Date settlementDate;
[ERROR SNIPPET]:
2020-09-05 02:51:18.105 ERROR 10080 --- [nio-8090-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {},ISO resolved to 2016-01-01 of type java.time.format.Parsed] with root cause
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: InstantSeconds
答案1
得分: 1
将您的模式更改为使用_uuuu_而不是_yyyy_;这个在这里有记录,这是Elasticsearch中负责这个更改的部分:https://www.elastic.co/guide/en/elasticsearch/reference/current/migrate-to-java-time.html#java-time-migration-incompatible-date-formats
我还看到另外一件事:
您正在使用只包含年份、月份和日期的日期格式。那是一个简单的日期。但java.util.Date
不是一个日期,而是一个在UTC时区内的时间点,包括时间戳。
所以,您应该像Ole在他的评论中建议的那样,将您的属性类型java.time.LocalDate
进行更改。这些类是在Java 8中引入的,以克服java.util.Date
的所有不足之处。
英文:
Change your pattern to use uuuu instead of yyyy; this is documented here, the change in Elasticsearch responsible for this: https://www.elastic.co/guide/en/elasticsearch/reference/current/migrate-to-java-time.html#java-time-migration-incompatible-date-formats
Another thing I see:
You are using a date format that contains just the year, month and day. That's a plain date. But java.util.Date
is not a date, but an instant in time in UTC zone - including a timestamp.
So you should change your property type java.time.LocalDate
like Ole suggested in his comment. These classes were introduced back in Java 8 to surcome all the deficiencies that java.util.Date
has.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论