2017-01-16 4 views
0

Il existe une classe JodaDateTimeConverter qui est apparemment conçue pour stocker des champs instantanés avec Spring Data Elasticsearch. Mais comment l'utiliser? Je n'ai trouvé aucun exemple.Comment utiliser Instant/JodaDateTimeConverter avec Spring Data Elasticsearch

Essayer d'utiliser instantanée comme un champ Date:

@Field(index = FieldIndex.analyzed, type = Date) 
private Instant someTime; 

me donne cette exception:

Caused by: java.lang.IllegalArgumentException: unknown property [epochSecond] 
    at org.elasticsearch.index.mapper.core.DateFieldMapper.innerParseCreateField(DateFieldMapper.java:520) 
    at org.elasticsearch.index.mapper.core.NumberFieldMapper.parseCreateField(NumberFieldMapper.java:241) 
    at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:321) 
    ... 21 more 

Répondre

0

J'ai trouvé un solution de contournement pour ce problème en utilisant un mappeur d'objet personnalisé comme décrit dans https://github.com/spring-projects/spring-data-elasticsearch/wiki/Custom-ObjectMapper et la configuration de Jackson sérialiser Instants en tant que timestamp:

public class CustomEntityMapper implements EntityMapper { 

private ObjectMapper objectMapper; 

public CustomEntityMapper(ObjectMapper objectMapper) { 
    this.objectMapper = objectMapper; 
    objectMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false); 
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true); 
    objectMapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false); 
} 

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

}

code de configuration Spring:

@Bean 
    @Autowired 
    public ElasticsearchTemplate elasticsearchTemplate(Client client) { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.registerModule(new JavaTimeModule()); 
     return new ElasticsearchTemplate(client, new CustomEntityMapper(objectMapper)); 
    } 
0

Tenir compte, lors de l'utilisation des référentiels ...

@Document(indexName = "ESINDEX", type = "TYPE", shards = 5) 
public class YourClass implements java.io.Serializable { 

@Id 
private String url; 

. 
. 
. 

@Field(type = FieldType.Date, format = DateFormat.date_optional_time) 
private Date created; 
@Field(type = FieldType.Date, format = DateFormat.date_optional_time) 
private Date updated; 

. 
. 
} 
+0

Mais je n'utilise pas Date, j'utilise Instant. – Pragmatick