2016-01-08 13 views
6

Wiem, że funkcja elasticsearch może tylko zapisywać typy Date wewnętrznie. Ale czy mogę uczynić go świadomym przechowywania/konwersji Java 8 ZonedDateTime, ponieważ używam tego typu w mojej jednostce?Jak przechowywać daty Java 8 (JSR-310) w elasticsearch

Używam wiosennego rozruchu: 1.3.1 + sprężynowa-danych-elastycznego wyszukiwania z jackson-datatype-jsr310 na ścieżce klas. Żadna konwersja nie ma zastosowania, gdy próbuję zapisać ZonedDateTime lub Instant lub coś innego.

Odpowiedz

0

Jednym ze sposobów osiągnięcia tego celu jest stworzenie własnego konwertera takiego:

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)); 
    } 
} 

a następnie skonfigurować JestClientFactory używać tego konwertera:

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(); 

nadzieję, że to pomoże.

+0

Moja najgorsza, przepraszam. Myślałem, że ISO_DATE_FORMAT nie ma informacji o strefie. Usuwam błędny komentarz. – mindas