springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConversions
問(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)容器中沒有相同類型的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
使用方法
由于@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)文章
詳解MyBatis的Dao層實(shí)現(xiàn)和配置文件深入
這篇文章主要為大家詳細(xì)介紹了MyBatis的Dao層實(shí)現(xiàn)和配置文件深入,文中的示例代碼講解詳細(xì),感興趣的小伙伴快來(lái)跟隨小編一起學(xué)習(xí)一下2022-07-07Java異常的幾個(gè)謎題_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文給大家收藏整理java異常的幾個(gè)謎題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-06-06MyBatis SpringMVC整合實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了MyBatis SpringMVC整合實(shí)現(xiàn)步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot實(shí)現(xiàn)分布式任務(wù)調(diào)度的詳細(xì)步驟
隨著互聯(lián)網(wǎng)應(yīng)用的規(guī)模和復(fù)雜度不斷增加,單節(jié)點(diǎn)任務(wù)調(diào)度系統(tǒng)已經(jīng)難以滿足高并發(fā)、大數(shù)據(jù)量的處理需求,分布式任務(wù)調(diào)度成為了解決這一問(wèn)題的重要手段,本文將介紹如何在Spring Boot中實(shí)現(xiàn)分布式任務(wù)調(diào)度,需要的朋友可以參考下2024-08-08Java讀取Properties文件的七種方法的總結(jié)
這篇文章主要介紹了Java讀取Properties文件的七種方法的總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-07-07SpringBoot創(chuàng)建并簡(jiǎn)單使用的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot創(chuàng)建并簡(jiǎn)單使用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java跳過(guò)證書訪問(wèn)HTTPS詳細(xì)代碼示例
在訪問(wèn)HTTPS網(wǎng)站時(shí),Java會(huì)默認(rèn)檢查SSL證書是否有效,如果證書無(wú)效,則會(huì)阻止訪問(wèn),這篇文章主要給大家介紹了關(guān)于Java跳過(guò)證書訪問(wèn)HTTPS的相關(guān)資料,需要的朋友可以參考下2024-02-02SpringBoot Web開發(fā)之系統(tǒng)任務(wù)啟動(dòng)與路徑映射和框架整合
這篇文章主要介紹了SpringBoot Web開發(fā)中的系統(tǒng)任務(wù)啟動(dòng)與路徑映射和Servlet、Filter、Listener框架整合,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08