spring?boot整合mongo查詢converter異常排查記錄
前言
使用過(guò)spring boot的人都知道spring boot約定優(yōu)于配置的理念給我們開(kāi)發(fā)中集成相關(guān)技術(shù)框架提供了很多的便利,集成mongo也是相當(dāng)?shù)暮?jiǎn)單,但是通過(guò)約定的配置信息來(lái)集成mongo有些問(wèn)題。
當(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)換問(wèn)題可以通過(guò)這個(gè)舉一反三的來(lái)解決。
所以,我們需要自定義的轉(zhuǎn)換器,而spring boot約定的MongoProperties并沒(méi)有配置轉(zhuǎn)換器一項(xiàng),我們不能簡(jiǎn)單的通過(guò)application.properties來(lái)達(dá)到我們的配置。
下面我們通過(guò)java bean的方式補(bǔ)充配置我們的帶自定義轉(zhuǎn)換器的MongoTemplate,來(lái)解決問(wèn)題
自定義轉(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é)果子類型的映射。
如果我們并不需要,可以通過(guò)構(gòu)造DefaultMongoTypeMapper傳空的方式去掉

后記:
網(wǎng)上大多數(shù)的講spring boot集成mongo的博文都類似官方的simple example,其他的都是spring通過(guò)xml的方式集成mongo的,有談到轉(zhuǎn)換器的問(wèn)題,但是把xml的方式轉(zhuǎn)換到spring boot的java bean config的方式需要我們對(duì)spring-data-mongo的api有深入的了解,當(dāng)然,你可以說(shuō)spring boot可以直接加載xml的配置,但是,既然用了spring boot,就推薦使用@Configuration這種方式解決問(wèn)題哈,所以,分享一個(gè)博主的經(jīng)驗(yàn),遇到類似的問(wèn)題而搜遍網(wǎng)絡(luò)無(wú)果時(shí),推薦一種解決的方式,官方文檔+源碼閱讀,不僅能解決問(wèn)題還能發(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)文章
Java使用JDBC連接postgresql數(shù)據(jù)庫(kù)示例
這篇文章主要介紹了Java使用JDBC連接postgresql數(shù)據(jù)庫(kù),結(jié)合實(shí)例形式分析了jdbc連接postgresql數(shù)據(jù)庫(kù)及數(shù)值插入、更新、查詢等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
流讀取導(dǎo)致StringBuilder.toString()亂碼的問(wèn)題及解決
這篇文章主要介紹了流讀取導(dǎo)致StringBuilder.toString()亂碼的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
如何使用SpringBoot集成Kafka實(shí)現(xiàn)用戶數(shù)據(jù)變更后發(fā)送消息
Spring Boot集成Kafka實(shí)現(xiàn)用戶數(shù)據(jù)變更后,向其他廠商發(fā)送消息,我們需要考慮配置Kafka連接、創(chuàng)建Kafka Producer發(fā)送消息、監(jiān)聽(tīng)用戶數(shù)據(jù)變更事件,并將事件轉(zhuǎn)發(fā)到Kafka,本文分步驟給大家講解使用SpringBoot集成Kafka實(shí)現(xiàn)用戶數(shù)據(jù)變更后發(fā)送消息,感興趣的朋友一起看看吧2024-07-07
Java中Lambda表達(dá)式和函數(shù)式接口的使用和特性
Java Lambda表達(dá)式是一種函數(shù)式編程的特性,可簡(jiǎn)化匿名內(nèi)部類的寫法,與函數(shù)式接口搭配使用,實(shí)現(xiàn)代碼簡(jiǎn)潔、可讀性高、易于維護(hù)的特點(diǎn),適用于集合操作、多線程編程等場(chǎng)景2023-04-04
SSH框架網(wǎng)上商城項(xiàng)目第16戰(zhàn)之Hibernate二級(jí)緩存處理首頁(yè)熱門顯示
這篇文章主要介紹了SSH框架網(wǎng)上商城項(xiàng)目第16戰(zhàn)之Hibernate的二級(jí)緩存處理首頁(yè)的熱門顯示,感興趣的小伙伴們可以參考一下2016-06-06

