How to make Spring Data Elasticsearch work with java.time.LocalDateTime for date

前端 未结 2 924
你的背包
你的背包 2020-12-28 21:12

I am using Spring Data support for Elasticsearch. Here is the timestamp field mapping:

@Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store =         


        
相关标签:
2条回答
  • 2020-12-28 21:31

    Check https://github.com/spring-projects/spring-data-elasticsearch/wiki/Custom-ObjectMapper to add JavaTimeModule to your 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);
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-28 21:52

    I was experiencing the similar issue: 'Z' in the date value is treated as a character, so the date parse failed. My solution is using custom pattern to make sure the conversion correct:

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

    And if we don't want to repeat the pattern on different fields again and again, we can try to centralize to the conversion logic. Spring Data Elastic Search provide the custom conversion feature, check here for the example.

    Basically we can write a converter from String to LocalDateTime, and put the date pattern over there.

    0 讨论(0)
提交回复
热议问题