【问题标题】:Unable to obtain Instant from TemporalAccessor: {},ISO resolved to 2018-01-01 of type java.time.format.Parsed无法从 TemporalAccessor:{} 获取 Instant,ISO 解析为 java.time.format.Parsed 类型的 2018-01-01
【发布时间】:2020-12-24 02:25:39
【问题描述】:

我制作了一个 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 来存储结算日期。当我使用 curl 进行查询时,我可以使用 CURL -X GET localhost:9200/transaction/_search 查看数据。但是,当我尝试通过 springboot 执行相同操作时,它会引发错误。我的实体是:

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 错误 10080 --- [nio-8090-exec-4] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于 servlet [dispatcherServlet]在路径 [] 的上下文中抛出异常 [请求处理失败;嵌套异常是 java.time.DateTimeException: Unable to get Instant from TemporalAccessor: {},ISO 解析为 java.time.format.Parsed 类型的 2016-01-01],根本原因

java.time.temporal.UnsupportedTemporalTypeException:不支持的字段:InstantSeconds

【问题讨论】:

  • 使用LocalDate 代替Date 是否可行? Date 无论如何都不代表日期。

标签: java spring-boot elasticsearch spring-data-elasticsearch elasticsearch-dsl


【解决方案1】:

改变你的模式以使用 uuuu 而不是 yyyy;这个is documented here,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 区域中的一个瞬间——包括时间戳。

因此,您应该更改您的属性类型java.time.LocalDate,就像 Ole 在他的评论中建议的那样。这些类是在 Java 8 中引入的,以克服 java.util.Date 的所有缺陷。

【讨论】:

  • 您好,我进行了更改,但仍然遇到相同的错误。我已经更新了映射和错误日志
  • 我添加了更多信息和更改建议
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
相关资源
最近更新 更多