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)容器中沒(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
使用方法
由于@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)文章
Java以struts2為例介紹如何實(shí)現(xiàn)圖片上傳
這篇文章主要介紹了Java struts2中如何實(shí)現(xiàn)圖片上傳的相關(guān)資料,需要的朋友可以參考下2015-11-11
解決Feign配置RequestContextHolder.getRequestAttributes()為null的問(wèn)題
這篇文章主要介紹了解決Feign配置RequestContextHolder.getRequestAttributes()為null的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
springboot項(xiàng)目中讀取.env文件參數(shù)值的兩種主流實(shí)現(xiàn)方式
在Spring Boot項(xiàng)目中,.env文件并非Spring Boot原生支持的配置格式,但可以通過(guò)第三方庫(kù)或自定義讀取邏輯來(lái)加載.env文件中的參數(shù),下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧2025-12-12
基于Java實(shí)現(xiàn)圖形驗(yàn)證碼工具類
這篇文章主要為大家詳細(xì)介紹了如何基于Java實(shí)現(xiàn)圖形驗(yàn)證碼工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
Java服務(wù)調(diào)用失敗報(bào)Service com.oneinfinite.adflow.api.service.T
在Java開(kāi)發(fā)中,服務(wù)調(diào)用是常見(jiàn)的操作,尤其是在微服務(wù)架構(gòu)中,然而,服務(wù)調(diào)用過(guò)程中可能會(huì)遇到各種問(wèn)題,下面我們來(lái)看看如何解決Service com.oneinfinite.adflow.api.service.TestService with version 0.0.0 not found的問(wèn)題吧2025-03-03
Spark Streaming編程初級(jí)實(shí)踐詳解
這篇文章主要為大家介紹了Spark Streaming編程初級(jí)實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Spring?Boot?4.0對(duì)于Java開(kāi)發(fā)的影響和前景
探索Spring?Boot?4.0如何徹底革新Java開(kāi)發(fā),提升效率并開(kāi)拓未來(lái)可能性!別錯(cuò)過(guò)這篇緊湊的指南,它帶你領(lǐng)略Spring?Boot的強(qiáng)大魅力和潛力,準(zhǔn)備好了嗎?2024-02-02
springboot?全局異常處理和統(tǒng)一響應(yīng)對(duì)象的處理方式
這篇文章主要介紹了springboot?全局異常處理和統(tǒng)一響應(yīng)對(duì)象,主要包括SpringBoot 默認(rèn)的異常處理機(jī)制和SpringBoot 全局異常處理,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06

