2016-01-08 4 views
6

Я знаю, что elasticsearch может сохранять только Date типов внутри. Но могу ли я сделать это для хранения/преобразования Java 8 ZonedDateTime, так как я использую этот тип в своей сущности?Как хранить даты Java 8 (JSR-310) в elasticsearch

Я использую весеннюю загрузку: 1.3.1 + spring-data-elasticsearch с jackson-datatype-jsr310 на пути к классам. Кажется, что никакие преобразования не применяются ни при попытке сохранить ZonedDateTime, ни Instant, или что-то еще.

ответ

0

Один из способов сделать это, чтобы создать пользовательский преобразователь, как это:

import com.google.gson.*; 

import java.lang.reflect.Type; 
import java.time.ZonedDateTime; 
import static java.time.format.DateTimeFormatter.*; 

public class ZonedDateTimeConverter implements JsonSerializer<ZonedDateTime>, JsonDeserializer<ZonedDateTime> { 
    @Override 
    public ZonedDateTime deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { 
    return ZonedDateTime.parse(jsonElement.getAsString(), ISO_DATE_TIME); 
    } 

    @Override 
    public JsonElement serialize(ZonedDateTime zonedDateTime, Type type, JsonSerializationContext jsonSerializationContext) { 
    return new JsonPrimitive(zonedDateTime.format(ISO_DATE_TIME)); 
    } 
} 

, а затем настроить JestClientFactory использовать этот конвертер:

Gson gson = new GsonBuilder() 
     .registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeConverter()).create(); 

    JestClientFactory factory = new JestClientFactory(); 

    factory.setHttpClientConfig(new HttpClientConfig 
     .Builder("elastic search URL") 
     .multiThreaded(true) 
     .gson(gson) 
     .build()); 
    client = factory.getObject(); 

Надеется, что это поможет.

+0

Мой плохой, извините. Я думал, что у ISO_DATE_FORMAT нет информации о зоне. Я удалю ошибочный комментарий. – mindas

 Смежные вопросы

  • Нет связанных вопросов^_^