千家信息网

spring boot整合mongo查询converter异常的方法

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇文章主要讲解了"spring boot整合mongo查询converter异常的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"spring b
千家信息网最后更新 2025年01月24日spring boot整合mongo查询converter异常的方法

这篇文章主要讲解了"spring boot整合mongo查询converter异常的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"spring boot整合mongo查询converter异常的方法"吧!

前言

使用过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配置 */@Configurationpublic 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查询converter异常的方法"的内容了,经过本文的学习后,相信大家对spring boot整合mongo查询converter异常的方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0