sprint data elasticsearch rest client无法处理localdatetime格式的问题

在使用HighLevelRestClient的时候,如果Document对象有LocalDateTime类的属性,那么在搜索结果转换为对象的时候就会报错,无法将long型转换为localdatetime,这时因为默认的elasticsearch converters里面不提供,所以需要我们自己添加。


@Configuration
public class ESConfiguration extends AbstractElasticsearchConfiguration {

@Value("${elasticsearch.config.hosts}")
private String hosts;

@Bean
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration configuration = ClientConfiguration.builder()
.connectedTo(this.hosts)
.build();

return RestClients.create(configuration).rest();
}

@Bean
@Override
public EntityMapper entityMapper() {

ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(
elasticsearchMappingContext(), new DefaultConversionService()
);
entityMapper.setConversions(elasticsearchCustomConversions());

return entityMapper;
}

/**
* 默认的converter不支持long到localdatime的转换,从elasticsearch读取的时候会报错,所以在这里添加一个。
*/
@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
List<Converter> converters= new ArrayList<>();
converters.add(LongToLocalDateTimeConverter.INSTANCE);
return new ElasticsearchCustomConversions(converters);
}

@ReadingConverter
static enum LongToLocalDateTimeConverter implements Converter<Long, LocalDateTime> {
INSTANCE;

private LongToLocalDateTimeConverter() {
}

public LocalDateTime convert(Long source) {
return Instant.ofEpochMilli(source).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}
}
posted @ 2020-02-15 18:50  怎么也得过啊  阅读(1663)  评论(1编辑  收藏  举报