当前位置: 首页 > 知识库问答 >
问题:

如何使Spring Data ElasticSearch与java.time.LocalDateTime一起工作

禹兴安
2023-03-14

我正在使用Spring Data支持Elasticsearch。以下是时间戳字段映射:

@Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true,
        format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
private LocalDateTime timestamp;

这导致Elasticsearch中字段的映射如下:

"timestamp":{"type":"date","store":true,"format":"yyyy-MM-dd'T'HH:mm:ss.SSSZZ"}

当我使用java.util.Date时,一切正常。但是,当我切换到java.time.LocalDateTime时,发送到Elasticsearch的文档会导致异常。以下是文档(时间戳字段仅为简洁起见):

"timestamp": {
    "hour":7, "minute":56, "second":9, "nano":147000000, "year":2017, "month":"FEBRUARY",
    "dayOfMonth":13, "dayOfWeek":"MONDAY", "dayOfYear":44, "monthValue":2, "chronology": {
        "id":"ISO", "calendarType": "iso8601"
    }
}

例外情况是:

MapperParsingException[failed to parse [timestamp]]; nested: IllegalArgumentException[unknown property [hour]];
(...)
Caused by: java.lang.IllegalArgumentException: unknown property [hour]

看起来在对文档进行 jsonization 时,此处忽略了该模式。有什么可能的提示吗?或者,也许您可能知道如何将“内置”_timestamp字段与 Spring 数据一起使用?

共有2个答案

郑声
2023-03-14

我遇到了类似的问题:日期值中的“Z”被视为字符,因此日期解析失败。我的解决方案是使用自定义模式来确保转换正确:

@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
private LocalDateTime dateField;

如果我们不想一次又一次地在不同的字段上重复模式,我们可以尝试集中到转换逻辑。Spring Data弹性搜索提供自定义转换功能,请在此处查看示例

基本上,我们可以编写一个从字符串到LocalDateTime的转换器,并将日期模式放在那里。

许永年
2023-03-14

选中https://github.com/spring-projects/spring-data-elasticsearch/wiki/Custom-ObjectMapper将JavaTimeMoules添加到您的ObjectMapper

@Configuration
public class ElasticSearchConfiguration {

  @Bean
  public ElasticsearchTemplate elasticsearchTemplate(Client client) {
    return new ElasticsearchTemplate(client, new CustomEntityMapper());
  }

  public static class CustomEntityMapper implements EntityMapper {

    private final ObjectMapper objectMapper;

    public CustomEntityMapper() {
      objectMapper = new ObjectMapper();
      objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
      objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
      objectMapper.registerModule(new CustomGeoModule());
      objectMapper.registerModule(new JavaTimeModule());
    }

    @Override
    public String mapToString(Object object) throws IOException {
      return objectMapper.writeValueAsString(object);
    }

    @Override
    public <T> T mapToObject(String source, Class<T> clazz) throws IOException {
      return objectMapper.readValue(source, clazz);
    }
  }
}
 类似资料:
  • 问题内容: 我正在使用Spring Data对Elasticsearch的支持。这是时间戳字段映射: 这导致Elasticsearch中的字段映射如下: 当我使用java.util.Date时,一切正常。但是,当我如上所述切换到java.time.LocalDateTime时,发送到Elasticsearch的文档导致异常。这是文档(为简洁起见,时间戳字段): 和例外: 似乎在对文档进行json转

  • 我的pom。xml如下所示 我已经尝试了三天,使用REdhat入门指南让这个简单的示例代码与Infinispan一起使用,并下载了快速入门zip来运行它,但仍然不起作用!我一直收到Spring JMS的错误“无法连接到foo: 11222”或“池未打开”,然后是关于混合Uber和Jars版本的警告。我开始使用ehcache,这很难实现,因为只有有限的简单示例展示了如何从rest调用等中存储、检索和

  • 我最近安装了privacy vpn,结果发现启用的openvpn会破坏Docker。 当我尝试运行时,我得到以下错误 禁用vpn可以解决这个问题(不过,我宁愿不禁用它)。有没有办法使这两者和平共处?我使用debian jessie,我的openvpn有以下版本字符串 null

  • 所以我尝试在magnolia中制作一些页面,以便它们在phoneGap中工作,phoneGap是一个包装器,包装HTML5/CSS/JavaScript,并将其部署为移动应用程序。 Magnolia的问题是,它使用诸如jtl或jsp之类的servlet,而as phoneGap只接受这些servlet。html页面,不呈现jtl或jsp页面。 那么,我该如何只制作HTML5页面呢? 如有任何想法/

  • 问题内容: 继续我提出的问题,我试图在我的代码库中使用ThreadPoolExecutor。即使反复尝试从Java API文档中理解,我也无法清楚地理解keepAliveTime要在构造函数中传递的参数的功能/目的。希望有人可以通过一些很好的例子向我解释。 Java文档摘录: keepAliveTime-当线程数大于内核数时,这是多余的空闲线程将在终止之前等待新任务的最长时间。 问题答案: 假设您