@Document(indexName = "xxx", type = "_doc")
public class BookEs implements Serializable {
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime created;
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updated;
当时间使用LocalDateTime时,向上面一样格式化后,查询报错,解决方法:
/**
* elasticsearch处理localDateTime
*
* @author yangle
* @date 2020-10-13 19:20
*/
@Configuration
public class ElasticsearchConfiguration extends ElasticsearchConfigurationSupport {
@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
List<Converter> converters= new ArrayList<>();
converters.add(DateToLocalDateTimeConverter.INSTANCE);
converters.add(StringToLocalDateTimeConverter.INSTANCE);
converters.add(LongToLocalDateTimeConverter.INSTANCE);
return new ElasticsearchCustomConversions(converters);
}
//保存类型为long类型
@ReadingConverter
enum LongToLocalDateTimeConverter implements Converter<Long, LocalDateTime> {
INSTANCE;
@Override
public java.time.LocalDateTime convert(Long source) {
return Instant.ofEpochMilli(source).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}
//格式化后保存结果为String类型
@ReadingConverter
enum StringToLocalDateTimeConverter implements Converter<String, LocalDateTime> {
INSTANCE;
@Override
public java.time.LocalDateTime convert(String source) {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return LocalDateTime.parse(source,df);
}
}
@WritingConverter
enum DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> {
INSTANCE;
@Override
public LocalDateTime convert(Date date) {
Instant instant = date.toInstant();
return instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}
}
补充:之前是直接写了一个vo去接受查询结果没有带@Field注解,采用上述结果可以解决,当使用原来带有@Field的实体类去接受,会出现object不能转成localDateTime的错误。解决如下:
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd HH:mm:ss")
private LocalDateTime created;
将yyyy更改为uuuu,不需要再去写上面的那个配置类了
ps:只针对springboot为2.3.3,spring-data-elasticsearch为4.0.3版本的。如果低版本不确定是否可以解决