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

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

前言

使用过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异常的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringBoot MongoDB 索引冲突分析及解决方法

    一.背景 spring-data-mongo 实现了基于 MongoDB 的 ORM-Mapping 能力, 通过一些简单的注解.Query封装以及工具类,就可以通过对象操作来实现集合.文档的增删改查: 在 SpringBoot 体系中,spring-data-mongo 是 MongoDB Java 工具库的不二之选. 二.问题产生 在一次项目问题的追踪中,发现SpringBoot 应用启动失败,报错信息如下: Error creating bean with name 'mongoTempl

  • Spring Boot无缝集成MongoDB

    上一节,我们做的那个例子有点太简单了,通常的后台都会涉及一些数据库的操作,然后在暴露的API中提供处理后的数据给客户端使用.那么这一节我们要做的是集成MongoDB ( https://www.mongodb.com ). MongoDB是什么? MongoDB是一个NoSQL数据库,是NoSQL中的一个分支:文档数据库.和传统的关系型数据库比如Oracle.SQLServer和MySQL等有很大的不同.传统的关系型数据库(RDBMS)已经成为数据库的代名词超过20多年了.对于大多数开发者来说,

  • SpringBoot整合之SpringBoot整合MongoDB的详细步骤

    目录 一.创建项目,选择依赖 二.引入相关依赖(非必要) 三.如果是第一次使用MongoDB,首先先创建用户 四.定义核心配置文件 六.创建dao层,这里的dao层有两种写法 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.本文介绍SpringBoot整合之SpringBoot整合MongoDB的步骤. 一

  • Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)

    1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合MongoDB的两种方法:MongoRepository和MongoTemplate. 代码结构如下: 2 项目准备 2.1 启动MongoDB实例 为了方便,使用Docker来启动MongoDB,详细指导文档请参考:基于Docker的MongoDB实现授权访问的方法,这里不再赘述. 2.2 引入相关依赖

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

    目录 前言 自定义转换器 javabean的方式配置MongoTemplate 后记: 前言 使用过spring boot的人都知道spring boot约定优于配置的理念给我们开发中集成相关技术框架提供了很多的便利,集成mongo也是相当的简单,但是通过约定的配置信息来集成mongo有些问题. 当你的字段包含Timestamp这种类型时,读取数据的时候会抛一个类型转换的异常,如 No converter found capable of converting from type [java.u

  • spring boot整合mybatis利用Mysql实现主键UUID的方法

    前言 本文主要给大家介绍了关于spring boot整合mybatis利用Mysql实现主键UUID的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现 基础项目的pom.xml部分代码如下 <properties> <java.version>1.8</java.version> </properties> <!-- Inherit defaults from Spring Boot --> <parent&

  • Spring boot整合shiro+jwt实现前后端分离

    本文实例为大家分享了Spring boot整合shiro+jwt实现前后端分离的具体代码,供大家参考,具体内容如下 这里内容很少很多都为贴的代码,具体内容我经过了看源码和帖子加了注释.帖子就没用太多的内容 先下载shiro和jwt的jar包 <!-- shiro包 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId

  • Spring Boot整合EhCache的步骤详解

    本文讲解Spring Boot与EhCache的整合. 1 EhCache简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点. 2 Spring Boot整合EhCache步骤 2.

  • Spring Boot 整合 MongoDB的示例

    本节使用SpringBoot 2.1.9.RELEASE,示例源码在https://github.com/laolunsi/spring-boot-examples/tree/master/06-spring-boot-mongo-demo SpringBoot可以非常方便地引入和操作MongoDB.本节分两部分,记录个人学习SpringBoot使用MongoDB数据库的一些知识. 第一部分是一个简单的springboot连接mongo的demo,测试查询功能. 第二部分是基于mongo实现的增

  • Spring Boot整合Mybatis Plus和Swagger2的教程详解

    前言:如果你是初学者,请完全按照我的教程以及代码来搭建(文末会附上完整的项目代码包,你可以直接下载我提供的完整项目代码包然后自行体验!),为了照顾初学者所以贴图比较多,请耐心跟着教程来,希望这个项目Demo能给你一些帮助,如果觉得写的还可以请给个关注和点赞,谢谢! 题外话:这是我第一篇用markdown来写的博文,格式不好的地方请见谅 一.pom.xml和application.yml 1.pom.xml中添加相关依赖,这里我把我的pom.xml代码贴出来 <?xml version="1

  • Spring Boot 整合 Fisco Bcos的案例分析(区块链)

    目录 简介 本地环境 主要流程: 1.Fisco Bcos环境搭建与验证 1.1.搭建单群组4节点联盟链: 1.2.检查证书 1.3.使用证书验证节点正确性 2.创建SpringBoot工程并配置依赖 2.1.创建SpringBoot工程: 2.2.配置pom.xml 3.2.配置节点证书: 3.3.编写controller 3.4.DemoBcosApplication默认不做修改 3.5.application.properties什么也没配置 4.生成jar包.部署服务器验证 4.1.本地

  • Spring Boot整合 NoSQL 数据库 Redis详解

    目录 引言 一.环境准备 二.构建Spring Boot项目 三.引入Redis依赖 四.Reds相关配置 五.添加Redis配置类 六.测试一下 引言 在日常的开发中,除了使用 Spring Boot 这个企业级快速构建项目的框架之外,随着业务数据量的大幅度增加,对元数据库造成的压力成倍剧增.在此背景下, Redis 这个 NoSQL 数据库已然整个项目架构中的不可或缺的一部分,懂得如何 Spring Boot 整合 Redis ,是当今开发人员必备的一项技能,接下来对整合步骤进行详细说明.

  • Spring Boot 整合 Reactor实例详解

    目录 引言 1 创建项目 2 集成 H2 数据库 3 创建测试类 3.1 user 实体 3.2 UserRepository 3.3 UserService 3.4 UserController 3.5 SpringReactorApplication 添加注解支持 测试 总结 引言 Reactor 是一个完全非阻塞的 JVM 响应式编程基础,有着高效的需求管理(背压的形式).它直接整合 Java8 的函数式 API,尤其是 CompletableFuture, Stream,还有 Durat

  • 微服务Spring Boot 整合Redis 阻塞队列实现异步秒杀下单思路详解

    目录 引言 一.秒杀优化 - 异步秒杀思路 二.秒杀优化 - 基于Redis完成秒杀资格判断 三.基于阻塞队列完成异步秒杀下单 四.测试程序 五.源码地址 引言 本章节,介绍使用阻塞队列实现秒杀的优化,采用异步秒杀完成下单的优化! 一.秒杀优化 - 异步秒杀思路 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 查询优惠卷 判断秒杀库存是否足够 查询订单 校验是否是一人一单 扣减库存 创建订单,完成 在以上6个步骤中,

随机推荐