当前位置: 首页 > 面试题库 >

如何使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]

似乎在对文档进行json转换时,此处的模式已被忽略。有任何提示吗?也许您可能知道如何在Spring Data中使用“内置” _timestamp字段?


问题答案:

检查https://github.com/spring-projects/spring-data-elasticsearch/wiki/Custom-
ObjectMapper
添加JavaTimeModule到您的中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的文档会导致异常。以下是文档(时间戳字段仅为简洁起见): 例外情况是: 看起来在对文档进行 jsonizatio

  • 问题内容: 无论如何,要从中获取与java.time(Java 8中的新功能)兼容的时间类? 我知道你可以使用的或但这些方法的返回这是现在已经过时,因此它似乎是不好的做法,以创建一个使用这些对象或类似。 问题答案: 新方法开 Timestamp Java 8在java.sql.Timestamp类上包含了新的方法,可以在java.time对象之间来回转换。在可以针对新数据类型更新JDBC驱动程序之

  • 问题内容: 现在,我使用setAdapter更新我的ListView,但我认为正确的方法是使用notifiyDatasetChanged(),但我无法在主类中使用它(它在适配器中)。这是错误: ListAdapter类型的方法notifyDatasetChanged()未定义 我猜想有一种更好的方法-有人能指出我正确的方向吗? 这是我的代码的相关部分: 这是适配器: 问题答案: 创建您的自定义适配

  • 问题内容: 我正在设置信用卡处理程序,需要对CURL使用替代方法。当我使用测试服务器(未调用SSL URL)时,以下代码运行良好,但是现在当我在使用HTTPS的工作服务器上对其进行测试时,它失败,并显示错误消息“无法打开流”。 问题答案: 请尝试以下脚本,以查看您的php脚本是否有https包装器。 输出应该是这样的

  • 问题内容: 我习惯在普通的log4j上使用。现在,我切换到,无法使附加程序正常工作。 下面的附加程序可以正常工作。但是永远不会创建的日志文件。为什么? 问题答案: 该标记缺少属性。

  • 问题内容: 我在使用Ajax和php时遇到麻烦。我正在尝试做的是调用ajax函数,该函数从表单的输入中获取值,并检查数据库中是否存在该电子邮件。这是我当前的javascript: 不幸的是,我无法戒备。在我的PHP函数中,它检查输入的是用户名还是电子邮件(仅出于我的目的,所以您知道),然后在任一列中查找它。如果找到它,则返回true,否则返回false: 所以我的问题是,ajax如何响应这些返回值