在使用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();
}
}
}