欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

問題場景

在將Timestamp類型存進Elasticsearc后,將其取出時拋出異常。

從提示中可以看出缺少從Long轉(zhuǎn)換到Timestamp的類型轉(zhuǎn)換器。

原理及分析

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

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

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

//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將其注冊到ioc容器中,@ConditionalOnMissingBean則是當容器中沒有相同類型的Bean才會進行創(chuàng)建。

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

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

通過其源碼可以看出MappingElasticsearchConverter提供了兩種構(gòu)造方法,自動配置類使用的是第一種,其conversionService為空,MappingElasticsearchConverter會使用類DefaultConversionService對屬性conversions來進行初始化,提供基礎(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);
}

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

通過向conversions添加自定義的converter來添加。

/**
	 * 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;
}

這種方法來自于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)建一個ElasticsearchConverter并添加到環(huán)境中既可。

首先先創(chuàng)建兩個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來初始化。

這里使用了defaultConversionService,避免其他的類型轉(zhuǎn)換受到影響,向其中添加自定義的兩個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)建一個ElasticsearchCustomConversions,添加兩個自定義的轉(zhuǎn)換器。

隨后在elasticsearchConverter中通過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é)

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

相關(guān)文章

  • Java通俗易懂系列設(shè)計模式之模板模式

    Java通俗易懂系列設(shè)計模式之模板模式

    這篇文章主要介紹了Java通俗易懂系列設(shè)計模式之模板模式,想了解設(shè)計模式的同學(xué),可以仔細看一下
    2021-04-04
  • 詳解MyBatis的Dao層實現(xiàn)和配置文件深入

    詳解MyBatis的Dao層實現(xiàn)和配置文件深入

    這篇文章主要為大家詳細介紹了MyBatis的Dao層實現(xiàn)和配置文件深入,文中的示例代碼講解詳細,感興趣的小伙伴快來跟隨小編一起學(xué)習(xí)一下
    2022-07-07
  • Java異常的幾個謎題_動力節(jié)點Java學(xué)院整理

    Java異常的幾個謎題_動力節(jié)點Java學(xué)院整理

    本文給大家收藏整理java異常的幾個謎題,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-06-06
  • MyBatis SpringMVC整合實現(xiàn)步驟詳解

    MyBatis SpringMVC整合實現(xiàn)步驟詳解

    這篇文章主要介紹了MyBatis SpringMVC整合實現(xiàn)步驟詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot實現(xiàn)分布式任務(wù)調(diào)度的詳細步驟

    SpringBoot實現(xiàn)分布式任務(wù)調(diào)度的詳細步驟

    隨著互聯(lián)網(wǎng)應(yīng)用的規(guī)模和復(fù)雜度不斷增加,單節(jié)點任務(wù)調(diào)度系統(tǒng)已經(jīng)難以滿足高并發(fā)、大數(shù)據(jù)量的處理需求,分布式任務(wù)調(diào)度成為了解決這一問題的重要手段,本文將介紹如何在Spring Boot中實現(xiàn)分布式任務(wù)調(diào)度,需要的朋友可以參考下
    2024-08-08
  • Java讀取Properties文件的七種方法的總結(jié)

    Java讀取Properties文件的七種方法的總結(jié)

    這篇文章主要介紹了Java讀取Properties文件的七種方法的總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • SpringBoot創(chuàng)建并簡單使用的實現(xiàn)

    SpringBoot創(chuàng)建并簡單使用的實現(xiàn)

    這篇文章主要介紹了SpringBoot創(chuàng)建并簡單使用的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java跳過證書訪問HTTPS詳細代碼示例

    Java跳過證書訪問HTTPS詳細代碼示例

    在訪問HTTPS網(wǎng)站時,Java會默認檢查SSL證書是否有效,如果證書無效,則會阻止訪問,這篇文章主要給大家介紹了關(guān)于Java跳過證書訪問HTTPS的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • SpringBoot Web開發(fā)之系統(tǒng)任務(wù)啟動與路徑映射和框架整合

    SpringBoot Web開發(fā)之系統(tǒng)任務(wù)啟動與路徑映射和框架整合

    這篇文章主要介紹了SpringBoot Web開發(fā)中的系統(tǒng)任務(wù)啟動與路徑映射和Servlet、Filter、Listener框架整合,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Maven引入外部jar的幾種方法(小結(jié))

    Maven引入外部jar的幾種方法(小結(jié))

    這篇文章主要介紹了Maven引入外部jar的幾種方法(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08

最新評論