2017-02-13 132 views
1

我正在使用Spring Data對Elasticsearch的支持。這裏是時間戳字段映射:如何使Spring Data Elasticsearch與java.time.LocalDateTime一起使用日期

@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] 

jsonizing文檔時,它看起來像模式正在這裏被忽略了。任何可能的提示?或者,也許你可能知道如何在Spring Data中使用「內置」_timestamp字段?

回答

1

檢查https://github.com/spring-projects/spring-data-elasticsearch/wiki/Custom-ObjectMapperJavaTimeModule添加到您的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

看起來很有希望。缺少JavaTimeModule的任何原因 – theadam

+0

也許支持JDK <8 ...您可以使用'objectMapper.findAndRegisterModules();'註冊類路徑中找到的所有模塊... –

相關問題