spring boot整合mongo查询converter异常排查记录

网友投稿 339 2022-08-23


spring boot整合mongo查询converter异常排查记录

目录前言自定义转换器javabean的方式配置MongoTemplate后记:yyKwsX

前言

使用过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全路径名添http://加到我们的mongdb的_class字段,如下图所示,主要是为了查询结果子类型的映射。

如果我们并不需要,可以通过构造DefaultMongoTypeMapper传空的方式去掉

后记:

网上大多数的讲spring boot集成mongo的博文都类似官方的simple example,其他的都是spring通过xml的方式集成mongo的,有谈到转换器的问题,但是把xml的方式转换到spring boot的java bean config的方式需要我们对spring-dahttp://ta-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异常的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:07 Python matplotlib numpy 动态爱心唯一的ta(0713男团)
下一篇:python——在文件存放路径下自动创建文件夹!(python在指定路径创建文件)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~