spring?boot整合mongo查詢converter異常排查記錄
前言
使用過spring boot的人都知道spring boot約定優(yōu)于配置的理念給我們開發(fā)中集成相關(guān)技術(shù)框架提供了很多的便利,集成mongo也是相當(dāng)?shù)暮?jiǎn)單,但是通過約定的配置信息來集成mongo有些問題。
當(dāng)你的字段包含Timestamp這種類型時(shí),讀取數(shù)據(jù)的時(shí)候會(huì)拋一個(gè)類型轉(zhuǎn)換的異常,如
No converter found capable of converting from type [java.util.Date] to type [java.sql.Timestamp]
是因?yàn)?,mongo本身時(shí)間類型為Date,在做結(jié)果映射的時(shí)候Date并不能強(qiáng)轉(zhuǎn)成Timestamp,這是其中的一個(gè)點(diǎn),當(dāng)然還有很多類似的數(shù)據(jù)轉(zhuǎn)換問題可以通過這個(gè)舉一反三的來解決。
所以,我們需要自定義的轉(zhuǎn)換器,而spring boot約定的MongoProperties并沒有配置轉(zhuǎn)換器一項(xiàng),我們不能簡(jiǎn)單的通過application.properties來達(dá)到我們的配置。
下面我們通過java bean的方式補(bǔ)充配置我們的帶自定義轉(zhuǎn)換器的MongoTemplate,來解決問題
自定義轉(zhuǎn)換器
import org.springframework.core.convert.converter.Converter; import java.sql.Timestamp; import java.util.Date; public class TimestampConverter implements Converter { public Timestamp convert(Date date) { if(date != null){ return new Timestamp(date.getTime()); } return null; } }
java bean的方式配置MongoTemplate
/** * Created by kl on 2017/3/22. * Content :mongodb的MongoTemplate配置 */ @Configuration public class MongoDBConfig { @Bean public MongoTemplate getMongoTemplate(MongoDbFactory dbFactory,MappingMongoConverter converter) { MongoTemplate template = new MongoTemplate(dbFactory, converter); return template; } @Bean public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory,CustomConversions conversions) { DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context); mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class)); mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));//去掉默認(rèn)mapper添加的_class mappingConverter.setCustomConversions(conversions);//添加自定義的轉(zhuǎn)換器 return mappingConverter; } @Bean public CustomConversions customConversions() { List list = new ArrayList(); list.add(new TimestampConverter()); return new CustomConversions(list); } }
ps:默認(rèn)的mongo類型映射會(huì)把我們的class全路徑名添加到我們的mongdb的_class字段,如下圖所示,主要是為了查詢結(jié)果子類型的映射。
如果我們并不需要,可以通過構(gòu)造DefaultMongoTypeMapper傳空的方式去掉
后記:
網(wǎng)上大多數(shù)的講spring boot集成mongo的博文都類似官方的simple example,其他的都是spring通過xml的方式集成mongo的,有談到轉(zhuǎn)換器的問題,但是把xml的方式轉(zhuǎn)換到spring boot的java bean config的方式需要我們對(duì)spring-data-mongo的api有深入的了解,當(dāng)然,你可以說spring boot可以直接加載xml的配置,但是,既然用了spring boot,就推薦使用@Configuration這種方式解決問題哈,所以,分享一個(gè)博主的經(jīng)驗(yàn),遇到類似的問題而搜遍網(wǎng)絡(luò)無果時(shí),推薦一種解決的方式,官方文檔+源碼閱讀,不僅能解決問題還能發(fā)現(xiàn)更多你不增了解的東西
官方文檔:https://docs.spring.io/spring-data/data-mongo/docs/2.0.0.M1/reference/html/
以上就是spring boot整合mongo查詢converter異常排查記錄的詳細(xì)內(nèi)容,更多關(guān)于spring boot mongo查詢converter異常的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot?log4j2.xml如何讀取application.yml中屬性值
這篇文章主要介紹了springboot?log4j2.xml如何讀取application.yml中屬性值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12swing中Tree與滾動(dòng)條用法實(shí)例分析
這篇文章主要介紹了swing中Tree與滾動(dòng)條用法,以實(shí)例形式分析了java基于swing實(shí)現(xiàn)圖形界面的使用技巧,需要的朋友可以參考下2015-09-09SpringBoot集成Validation參數(shù)校驗(yàn)
這篇文章主要為大家詳細(xì)介紹了SpringBoot集成Validation參數(shù)校驗(yàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Java實(shí)現(xiàn)為Word每一頁設(shè)置不同圖片水印的效果
Word中設(shè)置水印時(shí),可加載圖片設(shè)置為水印效果,但通常添加水印效果時(shí),會(huì)對(duì)所有頁面都設(shè)置成統(tǒng)一效果。所以本文為大家介紹了一個(gè)方法,可以實(shí)現(xiàn)對(duì)每一頁或者某個(gè)頁面設(shè)置不同的水印效果,需要的可以參考一下2022-02-02