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