2017-01-16 92 views
0

有一个JodaDateTimeConverter类,它明显被设计为使用Spring Data Elasticsearch存储Instant字段。但我该如何使用它?我还没有找到任何例子。如何在Spring Data中使用Instant/JodaDateTimeConverter Elasticsearch

尝试使用即时作为一个日期字段:

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

给了我这样的例外:

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 

回答

0

我找到了通过使用https://github.com/spring-projects/spring-data-elasticsearch/wiki/Custom-ObjectMapper中描述的自定义对象映射器并配置Jackson序列化时点的时间戳:

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

}

Spring配置代码:

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

考虑,使用时库...

@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

但我没有使用日期,我使用即时。 – Pragmatick

相关问题