
io.github.hpsocket.soa.starter.data.elasticsearch.config.SoaElasticConfig Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hp-soa-starter-data-elasticsearch Show documentation
Show all versions of hp-soa-starter-data-elasticsearch Show documentation
hp-soa: a fully functional, easy-to-use, and highly scalable microservice framework
package io.github.hpsocket.soa.starter.data.elasticsearch.config;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchCustomConversions;
import io.github.hpsocket.soa.framework.web.support.ZonedDateTimeProvider;
/** HP-SOA Elasticsearch 配置 */
@AutoConfiguration
@ConditionalOnExpression("'${spring.elasticsearch.uris:}' != ''")
public class SoaElasticConfig extends ElasticsearchConfigurationSupport
{
/** {@linkplain ZonedDateTime} 时间日期提供者 */
@Bean("zonedDateTimeProvider")
@ConditionalOnMissingBean(name = "zonedDateTimeProvider")
public ZonedDateTimeProvider zonedDateTimeProvider()
{
return new ZonedDateTimeProvider();
}
/** 自定义日期时间类型转换器
* 处理 Java Bean 的日期时间类型字段与 ES Date 类型字段映射。
*/
@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions()
{
List> converters = new ArrayList<>();
// Long/String/Date -> LocalDateTime
converters.add(LongToLocalDateTimeConverter.INSTANCE);
converters.add(StringToLocalDateTimeConverter.INSTANCE);
converters.add(DateToLocalDateTimeConverter.INSTANCE);
// Long/String/Date -> LocalDate
converters.add(LongToLocalDateConverter.INSTANCE);
converters.add(StringToLocalDateConverter.INSTANCE);
converters.add(DateToLocalDateConverter.INSTANCE);
// Long/String/Date -> ZonedDateTime
converters.add(LongToZonedDateTimeConverter.INSTANCE);
converters.add(StringToZonedDateTimeConverter.INSTANCE);
converters.add(DateToZonedDateTimeConverter.INSTANCE);
// LocalDateTime -> Long/String/Date
converters.add(LocalDateTimeToLongConverter.INSTANCE);
converters.add(LocalDateTimeToStringConverter.INSTANCE);
converters.add(LocalDateTimeToDateConverter.INSTANCE);
// LocalDate -> Long/String/Date
converters.add(LocalDateToLongConverter.INSTANCE);
converters.add(LocalDateToStringConverter.INSTANCE);
converters.add(LocalDateToDateConverter.INSTANCE);
// ZonedDateTime -> Long/String/Date
converters.add(ZonedDateTimeToLongConverter.INSTANCE);
converters.add(ZonedDateTimeToStringConverter.INSTANCE);
converters.add(ZonedDateTimeToDateConverter.INSTANCE);
return new ElasticsearchCustomConversions(converters);
}
@ReadingConverter
enum LongToLocalDateTimeConverter implements Converter
{
INSTANCE;
@Override
public LocalDateTime convert(Long source)
{
return Instant.ofEpochMilli(source).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}
@WritingConverter
enum LocalDateTimeToLongConverter implements Converter
{
INSTANCE;
@Override
public Long convert(LocalDateTime source)
{
return source.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
}
@ReadingConverter
enum StringToLocalDateTimeConverter implements Converter
{
INSTANCE;
@Override
public LocalDateTime convert(String source)
{
String t = source.indexOf('T') > 0 ? "'T'" : " ";
String mill = source.indexOf('.') > 0 ? ".SSS" : "";
StringBuilder sb = new StringBuilder(30);
sb.append("yyyy-MM-dd").append(t).append("HH:mm:ss").append(mill);
if(source.length() > 19 + mill.length())
sb.append("z");
DateTimeFormatter df = DateTimeFormatter.ofPattern(sb.toString());
return LocalDateTime.parse(source, df);
}
}
@WritingConverter
enum LocalDateTimeToStringConverter implements Converter
{
INSTANCE;
@Override
public String convert(LocalDateTime source)
{
return source.atZone(ZoneId.systemDefault()).toString();
}
}
@WritingConverter
enum DateToLocalDateTimeConverter implements Converter
{
INSTANCE;
@Override
public LocalDateTime convert(Date date)
{
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}
@WritingConverter
enum LocalDateTimeToDateConverter implements Converter
{
INSTANCE;
@Override
public Date convert(LocalDateTime source)
{
return new Date(source.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
}
}
@WritingConverter
enum LocalDateToLongConverter implements Converter
{
INSTANCE;
@Override
public Long convert(LocalDate source)
{
return source.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
}
@ReadingConverter
enum LongToLocalDateConverter implements Converter
{
INSTANCE;
@Override
public LocalDate convert(Long source)
{
return Instant.ofEpochMilli(source).atZone(ZoneId.systemDefault()).toLocalDate();
}
}
@ReadingConverter
enum StringToLocalDateConverter implements Converter
{
INSTANCE;
@Override
public LocalDate convert(String source)
{
int length = source.length();
if(length <= 10)
return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String t = source.indexOf('T') > 0 ? "'T'" : " ";
String mill = source.indexOf('.') > 0 ? ".SSS" : "";
StringBuilder sb = new StringBuilder(30);
sb.append("yyyy-MM-dd").append(t).append("HH:mm:ss").append(mill);
if(length > 19 + mill.length())
sb.append("z");
DateTimeFormatter df = DateTimeFormatter.ofPattern(sb.toString());
return LocalDate.parse(source, df);
}
}
@WritingConverter
enum LocalDateToStringConverter implements Converter
{
INSTANCE;
@Override
public String convert(LocalDate source)
{
return source.toString();
}
}
@WritingConverter
enum DateToLocalDateConverter implements Converter
{
INSTANCE;
@Override
public LocalDate convert(Date date)
{
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
}
@WritingConverter
enum LocalDateToDateConverter implements Converter
{
INSTANCE;
@Override
public Date convert(LocalDate source)
{
return new Date(source.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli());
}
}
@ReadingConverter
enum LongToZonedDateTimeConverter implements Converter
{
INSTANCE;
@Override
public ZonedDateTime convert(Long source)
{
return Instant.ofEpochMilli(source).atZone(ZoneId.systemDefault());
}
}
@WritingConverter
enum ZonedDateTimeToLongConverter implements Converter
{
INSTANCE;
@Override
public Long convert(ZonedDateTime source)
{
return source.toInstant().toEpochMilli();
}
}
@ReadingConverter
enum StringToZonedDateTimeConverter implements Converter
{
INSTANCE;
@Override
public ZonedDateTime convert(String source)
{
String t = source.indexOf('T') > 0 ? "'T'" : " ";
String mill = source.indexOf('.') > 0 ? ".SSS" : "";
StringBuilder sb = new StringBuilder(30);
sb.append("yyyy-MM-dd").append(t).append("HH:mm:ss").append(mill);
if(source.length() > 19 + mill.length())
sb.append("z");
DateTimeFormatter df = DateTimeFormatter.ofPattern(sb.toString());
return ZonedDateTime.parse(source, df);
}
}
@WritingConverter
enum ZonedDateTimeToStringConverter implements Converter
{
INSTANCE;
@Override
public String convert(ZonedDateTime source)
{
return source.toString();
}
}
@ReadingConverter
enum DateToZonedDateTimeConverter implements Converter
{
INSTANCE;
@Override
public ZonedDateTime convert(Date date)
{
return date.toInstant().atZone(ZoneId.systemDefault());
}
}
@WritingConverter
enum ZonedDateTimeToDateConverter implements Converter
{
INSTANCE;
@Override
public Date convert(ZonedDateTime source)
{
return new Date(source.toInstant().toEpochMilli());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy