最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConversions

 更新時(shí)間:2023年08月11日 09:18:58   作者:子黃求知若渴  
這篇文章主要介紹了springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConversions問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

問(wèn)題場(chǎng)景

在將Timestamp類型存進(jìn)Elasticsearc后,將其取出時(shí)拋出異常。

從提示中可以看出缺少?gòu)腖ong轉(zhuǎn)換到Timestamp的類型轉(zhuǎn)換器。

原理及分析

在spring-data-elasticsearch中,java對(duì)象到j(luò)son的互相轉(zhuǎn)換是通過(guò)ElasticsearchConverter來(lái)進(jìn)行的。

使用springboot的自動(dòng)配置機(jī)制能夠快速地完成elasticsearch的配置,導(dǎo)入spring-boot-starter-data-elasticsearch依賴后,spring將會(huì)自動(dòng)向ioc容器中添加client,converter,template等Bean,只需要簡(jiǎn)單地配置elasticSearch服務(wù)器信息后就可以使用。

在org.springframework.boot.autoconfigure.data.elasticsearch中通過(guò)@Import導(dǎo)入ElasticsearchDataConfiguration類,默認(rèn)的converter就是通過(guò)這個(gè)類提供的。

//org.springframework.boot.autoconfigure.data.elasticsearch
@Import({ ElasticsearchDataConfiguration.BaseConfiguration.class,
		ElasticsearchDataConfiguration.RestClientConfiguration.class,
		ElasticsearchDataConfiguration.ReactiveRestClientConfiguration.class })
public class ElasticsearchDataAutoConfiguration {
}

在org.springframework.boot.autoconfigure.data.elasticsearch中可以看到方法elasticsearchConverter,使用@Bean將其注冊(cè)到ioc容器中,@ConditionalOnMissingBean則是當(dāng)容器中沒(méi)有相同類型的Bean才會(huì)進(jìn)行創(chuàng)建。

//org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataConfiguration.BaseConfiguration
@Bean
@ConditionalOnMissingBean
ElasticsearchConverter elasticsearchConverter(SimpleElasticsearchMappingContext mappingContext) {
    return new MappingElasticsearchConverter(mappingContext);
}

這里使用了MappingElasticsearchConverter來(lái)作為elasticsearch的默認(rèn)類型轉(zhuǎn)換器。

通過(guò)其源碼可以看出MappingElasticsearchConverter提供了兩種構(gòu)造方法,自動(dòng)配置類使用的是第一種,其conversionService為空,MappingElasticsearchConverter會(huì)使用類DefaultConversionService對(duì)屬性conversions來(lái)進(jìn)行初始化,提供基礎(chǔ)的轉(zhuǎn)換功能。

public MappingElasticsearchConverter(
    MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) {
    this(mappingContext, null);
}
public MappingElasticsearchConverter(
    MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext,
    @Nullable GenericConversionService conversionService) {
    Assert.notNull(mappingContext, "MappingContext must not be null!");
    this.mappingContext = mappingContext;
    this.conversionService = conversionService != null ? conversionService : new DefaultConversionService();
    this.typeMapper = ElasticsearchTypeMapper.create(mappingContext);
}

同時(shí)MappingElasticsearchConverter類提供了setConversions來(lái)設(shè)置自定義的轉(zhuǎn)換器CustomConversions。

通過(guò)向conversions添加自定義的converter來(lái)添加。

/**
	 * Set the {@link CustomConversions} to be applied during the mapping process. <br />
	 * Conversions are registered after {@link #afterPropertiesSet() bean initialization}.
	 *
	 * @param conversions must not be {@literal null}.
	 */
public void setConversions(CustomConversions conversions) {
    this.conversions = conversions;
}

這種方法來(lái)自于spring-data官方文檔 章節(jié)6.1.3

原鏈接:https://docs.spring.io/spring-data/elasticsearch/docs/4.2.3/reference/html/#elasticsearch.mapping.meta-model

使用方法

由于@ConditionalOnMissingBean的存在,我們只需要自己創(chuàng)建一個(gè)ElasticsearchConverter并添加到環(huán)境中既可。

首先先創(chuàng)建兩個(gè)Converter,分別用于Timestamp, Long的互相轉(zhuǎn)換。

@WritingConverter
static class TimestampToLong implements Converter<Timestamp, Long> {
    @Override
    public Long convert(Timestamp source) {
        return source.getTime();
    }
}
@ReadingConverter
static class LongToTimestamp implements Converter<Long, Timestamp> {
    @Override
    public Timestamp convert(Long source) {
        return new Timestamp(source);
    }
}

方法1:

觀察MappingElasticsearchConverter的構(gòu)造方法發(fā)現(xiàn),可以自行傳入ConversionService來(lái)初始化。

這里使用了defaultConversionService,避免其他的類型轉(zhuǎn)換受到影響,向其中添加自定義的兩個(gè)converter, 并將其添加到MappingElasticsearchConverter構(gòu)造器參數(shù)中。

@Bean
ElasticsearchConverter elasticsearchConverter(SimpleElasticsearchMappingContext mappingContext) {
    DefaultConversionService defaultConversionService = new DefaultConversionService();
    defaultConversionService.addConverter(new TimestampToLong());
    defaultConversionService.addConverter(new LongToTimestamp());
    return new MappingElasticsearchConverter(mappingContext, defaultConversionService);
}

方法2:

使用MappingElasticsearchConverter.setConversions方法向其添加自定義轉(zhuǎn)換服務(wù)ElasticsearchCustomConversions。

首先創(chuàng)建一個(gè)ElasticsearchCustomConversions,添加兩個(gè)自定義的轉(zhuǎn)換器。

隨后在elasticsearchConverter中通過(guò)setConversions添加到MappingElasticsearchConverter中。

@Bean
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
    return new ElasticsearchCustomConversions(
        Arrays.asList(new TimestampToLong(), new LongToTimestamp()));
}
@Bean
public ElasticsearchConverter elasticsearchConverter(SimpleElasticsearchMappingContext mappingContext, ElasticsearchCustomConversions elasticsearchCustomConversions) {
    MappingElasticsearchConverter mappingElasticsearchConverter = new MappingElasticsearchConverter(mappingContext);
    mappingElasticsearchConverter.setConversions(elasticsearchCustomConversions);
    return mappingElasticsearchConverter;
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

黄山市| 清徐县| 横山县| 长岭县| 衢州市| 曲水县| 阜南县| 大连市| 淄博市| 韩城市| 边坝县| 蓬安县| 宁强县| 陆良县| 民乐县| 顺平县| 泰兴市| 临沂市| 桐柏县| 古丈县| 来宾市| 元朗区| 日照市| 桦甸市| 沙河市| 平塘县| 德州市| 白城市| 屏东市| 天门市| 肃北| 孟津县| 铅山县| 喀什市| 库尔勒市| 垦利县| 上杭县| 江门市| 新巴尔虎左旗| 宕昌县| 竹溪县|