首頁 > 軟體

spring boot整合mongo查詢converter異常排查記錄

2022-03-05 19:00:41

前言

使用過spring boot的人都知道spring boot約定優於設定的理念給我們開發中整合相關技術框架提供了很多的便利,整合mongo也是相當的簡單,但是通過約定的設定資訊來整合mongo有些問題。

當你的欄位包含Timestamp這種型別時,讀取資料的時候會拋一個型別轉換的異常,如

No converter found capable of converting from type [java.util.Date] to type [java.sql.Timestamp]

是因為,mongo本身時間型別為Date,在做結果對映的時候Date並不能強轉成Timestamp,這是其中的一個點,當然還有很多類似的資料轉換問題可以通過這個舉一反三的來解決。

所以,我們需要自定義的轉換器,而spring boot約定的MongoProperties並沒有設定轉換器一項,我們不能簡單的通過application.properties來達到我們的設定。

下面我們通過java bean的方式補充設定我們的帶自定義轉換器的MongoTemplate,來解決問題

自定義轉換器

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));//去掉預設mapper新增的_class
        mappingConverter.setCustomConversions(conversions);//新增自定義的轉換器
        return mappingConverter;
    }
    @Bean
    public CustomConversions customConversions() {
        List list = new ArrayList();
        list.add(new TimestampConverter());
        return new CustomConversions(list);
    }
}

ps:預設的mongo型別對映會把我們的class全路徑名新增到我們的mongdb的_class欄位,如下圖所示,主要是為了查詢結果子型別的對映。

如果我們並不需要,可以通過構造DefaultMongoTypeMapper傳空的方式去掉

後記:

網上大多數的講spring boot整合mongo的博文都類似官方的simple example,其他的都是spring通過xml的方式整合mongo的,有談到轉換器的問題,但是把xml的方式轉換到spring boot的java bean config的方式需要我們對spring-data-mongo的api有深入的瞭解,當然,你可以說spring boot可以直接載入xml的設定,但是,既然用了spring boot,就推薦使用@Configuration這種方式解決問題哈,所以,分享一個博主的經驗,遇到類似的問題而搜遍網路無果時,推薦一種解決的方式,官方檔案+原始碼閱讀,不僅能解決問題還能發現更多你不增瞭解的東西

官方檔案:https://docs.spring.io/spring-data/data-mongo/docs/2.0.0.M1/reference/html/

以上就是spring boot整合mongo查詢converter異常排查記錄的詳細內容,更多關於spring boot mongo查詢converter異常的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com