SpringBoot项目配置mongodb多数据源以及自定义类型转换

mongodb多数据源配置,需要修改mongodb默认的yml配置文件

修改项目中的application-mongodb-dev.yml文件

spring:data:mongodb:
#   第一个数据源,或默认数据源one:uri: mongodb://username:password@ip:port/collectionName
#   第二个数据源two:uri: mongodb://username:password@ip:port/collectionNamelogging:level:org.springframework.data.mongodb.core: debug

然后添加配置类:

package com.dcboot.configuration.mongodb;import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;/*** @author xiaomifeng1010* @version 1.0* @date: 2022/6/23 18:36* @Description mongodb多数据源配置*/
@Configuration
public class MongoConfiguration {@Bean(name = "oneMongoProperties")@Primary@ConfigurationProperties(prefix = "spring.data.mongodb.one")public MongoProperties masterMongoProperties() {return new MongoProperties();}@Bean(name = "twoMongoProperties")@ConfigurationProperties(prefix = "spring.data.mongodb.two")public MongoProperties twoMongoProperties() {return new MongoProperties();}
}

由于java中的BigDecimal类型在保存到mongodb的时候,会自动转换为字符串String类型,虽然在读取数据到java中的时候,可以自动匹配到BigDecimal类型,似乎对程序没有什么影响,不过既然mongodb中增加了Decimal128类型,支持精确的小数, 那么还是希望可以直接使用Decimal128,所以需要自定义BigDecimal与Decimal128类型转换器

下边是写转换器

package com.dcboot.configuration.mongodb;import org.bson.types.Decimal128;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.WritingConverter;import java.math.BigDecimal;/*** @author xiaomifeng1010* @version 1.0* @date: 2022/7/22 16:50* @Description  java-->mongo  即BigDecimal转换为mongodb中的Decimal128的转换器*/
@WritingConverter
public class BigDecimalToDecimal128Converter implements Converter<BigDecimal, Decimal128> {/*** Convert the source object of type {@code S} to target type {@code T}.** @param source the source object to convert, which must be an instance of {@code S} (never {@code null})* @return the converted object, which must be an instance of {@code T} (potentially {@code null})* @throws IllegalArgumentException if the source cannot be converted to the desired target type*/@Overridepublic Decimal128 convert(BigDecimal source) {return new Decimal128(source);}
}

接着是从mongodb读取数据时的读类型转换器

package com.dcboot.configuration.mongodb;import org.bson.types.Decimal128;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;import java.math.BigDecimal;/*** @author xiaomifeng1010* @version 1.0* @date: 2022/7/22 16:57* @Description mongo--->java  即mongodb中的Decimal128类型转换为为BigDecimal的转换器*/
@ReadingConverter
public class Decimal128ToBigDecimalConverter implements Converter<Decimal128, BigDecimal> {@Overridepublic BigDecimal convert(Decimal128 decimal128) {return decimal128.bigDecimalValue();}
}

最后配置多数据源默认使用的mongotemplate,以及将转换器注入到mongotemplate中

package com.dcboot.configuration.mongodb;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;import java.util.ArrayList;
import java.util.List;/*** @author xiaomifeng1010* @version 1.0* @date: 2022/6/23 18:39* @Description 本系统mongodb数据源配置*/
@Configuration
@EnableMongoRepositories(mongoTemplateRef = "mongoTemplate")
public class DefaultMongoTemplateConf {private final MongoProperties mongoProperties;public DefaultMongoTemplateConf(@Qualifier("oneMongoProperties") MongoProperties mongoProperties) {this.mongoProperties = mongoProperties;}@Bean@Primarypublic MongoTemplate mongoTemplate() {MongoTemplate mongoTemplate=new MongoTemplate(mongoDatabaseFactory(mongoProperties));MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();mongoMapping.setCustomConversions(mongoCustomConversions());mongoMapping.afterPropertiesSet();return mongoTemplate;}@Bean(name = "oneMongoFactory")@Primarypublic MongoDatabaseFactory mongoDatabaseFactory(MongoProperties mongoProperties) {return new SimpleMongoClientDatabaseFactory(mongoProperties.getUri());}/*** mongoCustomConversions会由spring进行管理,* 按照加入的转换器,在数据库读写时对数据类型进行转换* @return*/@Beanpublic MongoCustomConversions mongoCustomConversions() {List<Converter<?, ?>> converterList = new ArrayList<>();converterList.add(new BigDecimalToDecimal128Converter());converterList.add(new Decimal128ToBigDecimalConverter());return new MongoCustomConversions(converterList);}}

接着配置第二个数据源的nongotemplate,第二个数据源暂时不涉及金额,所以不用注入转换器

package com.dcboot.configuration.mongodb;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;/*** @author xiaomifeng1010* @version 1.0* @date: 2022/6/23 18:44* @Description 外部服务数据源配置*/
@Configuration
@EnableMongoRepositories(mongoTemplateRef = "twoMongo")
public class TwoMongoTemplateConf {private final MongoProperties mongoProperties;public TwoMongoTemplateConf(@Qualifier("twoMongoProperties") MongoProperties mongoProperties) {this.mongoProperties = mongoProperties;}@Bean(name = "twoMongo")public MongoTemplate mongoTemplate() {return new MongoTemplate(mongoDatabaseFactory(mongoProperties));}@Bean(name = "twoMongoFactory")public MongoDatabaseFactory mongoDatabaseFactory(MongoProperties mongoProperties) {return new SimpleMongoClientDatabaseFactory(mongoProperties.getUri());}}
// 默认的第一个数据源,注入时,直接
@Autowired
private MongoTemplate mongoTemplate;

第二个数据源的mongotemplate注入使用时


import cn.hutool.core.util.BooleanUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.dcboot.module.common.enums.seal.SealNameEnum;
import com.dcboot.module.seeyon.entity.Formmain0080;
import com.dcboot.module.signetz.constant.SignetzRequestPathConstant;
import com.dcboot.module.signetz.dto.request.*;
import com.dcboot.module.signetz.mongo.entity.Seal;
import com.dcboot.module.signetz.service.SignetzSealService;
import com.dcboot.module.signetz.util.SignetzSealRequestUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.AccessLevel;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;/*** @author xiaomifeng1010* @version 1.0* @date: 2022/6/18 15:54* @Description*/
@Service
@Setter(onMethod_=@Autowired)
@Slf4j
public class SignetzSealServiceImpl implements SignetzSealService {private SignetzSealRequestUtil signetzSealRequestUtil;private SignetzLoginRequestDTO signetzLoginRequestDTO;@Autowired@Qualifier("twoMongo")@Setter(AccessLevel.NONE)private MongoTemplate twoMongo;}

然后将BigDecimal类型存入到mongodb时就是Decimal128类型了

在navicat中查看数据:

 财务指标中的金额,已经是Decimal128类型了,通过启用类型颜色标识,紫色标识Decimal128可知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/255291.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

3-8电路布线

问题描述 在一块电路板的上、下两端分别有n个接线柱。根据电路设计&#xff0c;要求用导线将上端接线柱与下端接线柱相连借用https://blog.csdn.net/LDUtyk大佬的图片 如上图所示, 上端 i 节点与下端Ω(i) 节点相连, 但是要求连线不能交叉。Ω&#xff08;x&#xff09;是一个…

JSP.day01.01JSP学习

JSP基础学习 01.page指令 导入包&#xff0c;指明输入内容类型&#xff0c;控制session等 02.include指令 include指令用于当前JSP中包含其他文件&#xff0c;被包含的文件可以是JSP、HTML或文本文件。 <% include file"文件的相对路径"%>03tagelib指令 t…

51单片机期末课程作业之蓝牙、操控、测速、里程小车

文章底部附源码 课程设计报告 学 科&#xff1a; 单片机原理及应用 项 目&#xff1a; 里程记录仪 学 院&#xff1a; 专业、年级&#xff1a; 指导老师&#xff1a; 摘要 设计首先实现对…

实现微信JS-SDK分享自定义标题和图片

2019独角兽企业重金招聘Python工程师标准>>> 这里先说明下&#xff0c;如果你想要自定义去分享图片的话是需要你去开通微信公众平台的不多也就300&#xff0c;在看之前我希望大家能先去看一下微信官网给出的开发文档(http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0…

微信JSSDK开发,调用微信扫一扫 JAVA jsp前端 js实现

// 微信JSSDK的AccessToken请求URL地址ublic final static String weixin_jssdk_acceToken_url "https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid公众号appid&secret众号appsecret; // 微信JSSDK的ticket请求URL地址 public final…

公众号怎么弄html,微信公众号与HTML 5混合模式揭秘1——如何部署JSSDK

本文是连载J享。发概程间告屏会。一控近到都从述序也问SSDKH5的书&#xff0c;这里是第一篇揭秘————如何部署JSSD支器事的后功发久这含层请间业在屏有随些气和域&#xff0c;实按控幻近持的前时来能过后些的处求也务浏蔽等机站风滚或默现钮制灯近持的前时来K 部署讲过一围多…

如何在微信小程序中调用腾讯地图api

微信小程序的地图api是非常有限的&#xff0c;如果要搜索地图上的位置&#xff0c;比如附近的医院、学校等&#xff0c;就需要使用地图api&#xff0c;使用腾讯地图api的过程如下&#xff1a; 一、开发者申请腾讯地图 进入官网http://lbs.qq.com/key.html 申请密钥 验证完手…

php 微信公众号分享自定义标题,简介,图片

1、必须有认证的公众号 2、设置域名到JS接口安全域名 3、设置IP白名单 4、查看微信JS-SDK说明文档 文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html ** 示例代码&#xff1a;** http://demo.open.weixin.qq.com/jssdk/sample.zip <?php//…

微信公众号支付 jssdk ,后端 laravel + easywechat,前端 uniapp

前提&#xff1a;商户号&#xff0c;各种授权域名 &#xff0c;app_id api_key 证书 等&#xff0c;都已配置好了。 不会配置的参考官方文档&#xff1a; https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_1.shtml 主要流程 前端&#xff1a;用户点购买按钮 前端…

微信公众号基础04_分享和录音功能的实现

本文简单说明一下微信测试号分享和录音功能的调用&#xff0c;其他JSSD功能与这类似 参考&#xff1a;微信JS-SDK文档 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E8.8E.B7.E5.8F.96.E2.80.9C.E5.88.86.E4.BA.AB.E7.BB.99.E6.9C.8B.E5.8F.8B.E2.8…

【22-23 春学期】AI作业12-LSTM

网络 LSTM&#xff08;输入门、遗忘门、输出门&#xff09; LSTM&#xff08;长短时记忆网络&#xff09;是一种特殊的RNN&#xff08;循环神经网络&#xff09;&#xff0c;能够学习长期的依赖关系。它通过原始 RNN 的隐藏层只有一个状态&#xff0c;它对于短期的输入非常敏感…

强推宝藏网站

最近还是有很强烈的感受&#xff0c;方法大于努力。最近就整理了一下大学期间比较好用的网站&#xff0c;也陪我度过了一段时间了&#xff0c;排名不分先后&#xff0c;把压箱底的东西拿出来了。 ChatGPT WeTab 新标签页https://www.wetab.link/ChatGPT国内免费使用方法有哪些…

AutoCAD三维建模图——汽车车轮

点击前往下载链接 AutoCAD三维建模图——汽车车轮&#xff0c;超真实&#xff0c;带胎路纹理&#xff0c;轮毂钢圈等等 橡胶轮胎建模&#xff0c;钢圈 胎路纹理 轮毂&#xff0c;螺丝&#xff0c;线条 展示图 展示图

CAD轴测图怎么画,才能不踩坑?

CAD轴测图怎么画&#xff1f;相信从事机械设计、产品设计的小伙伴&#xff0c;对于CAD轴测图并不陌生。CAD轴测图凭借立体感强、直观性好等特点&#xff0c;常作为产品设计制图的辅助图样&#xff0c;用来帮助人们读懂正投影视图&#xff0c;展示产品的整体结构特征。那么如何在…

cad超级排孔_家具cad排孔图 爆破排孔图

求一张板式家具CAD图&#xff0c;设计图&#xff0c;下料&#xff0c;排孔&#xff0c;安装图。 此外... 您可以使用正方形软件绘制家具效果图&#xff0c;可以使用3d max&#xff0c;还可以使用AUTO CAD绘制平面图、剖面图、效果图和三维线图。如果想省事&#xff0c;可以弄个…

【CAD3D】0基础绘制立体模型

一、需求 使用autocad软件绘制一个15.6寸裸屏立体模型。 二、操作 2.1建立文件 打开cad软件&#xff0c;点击左上角空白文件图标新建一个文件&#xff0c;会弹出选择样板窗口。选择acad3D.dwt样板&#xff0c;用于绘制3维模型。仅显示名称&#xff0c;不用理会。点击打开后创…

cad怎么表示出一个孔_AutoCAD如何画一个带孔的立体球

原标题:AutoCAD如何画一个带孔的立体球 第一步,在AutoCAD2007中操作菜单“绘图”→“建模”→“球体”,命令行窗口提示“指定中心点或 [三点(3P)/两点(2P)/相切、相切、半径(T)]:”,在模型空间任意位置点击鼠标;命令行窗口接着提示“指定半径或 [直径(D)]:”,键入“50”…

cad快看_CAD三维这样材质贴图,你学会了吗 ?

▲ 点击“CAD教学”,获取海量学习资料和免费教程 CAD画好三维图后,如果想给它贴图上大理石材质大概看一下效果如何,可以这样操作 ▲画好的三维图 1、点击菜单栏的视图——渲染——材质浏览器。 2、弹出的窗口中点击左下角这个+号按钮。 3、如果需要两种材质以上,可以选择新…

如何应用迅捷CAD编辑器,来绘制一份立体图形。

在CAD设计&#xff0c;为了效果的显著性&#xff0c;经常会用到关于CAD立体图形的绘制&#xff0c;立体图形要知道&#xff0c;是运用三维看图才能显示出来的&#xff0c;现在的CAD绘图软件也都有了关于CAD立体三维图形绘制的功能&#xff0c;那具体是怎么运用的呢&#xff1f;…

cad角度怎么画_初学入门CAD,就这样成精了!

经常有朋友问我怎么学习CAD&#xff0c;或者要求学习CAD&#xff0c;所以我觉得有必要把与学习CAD有关的几个问题阐述一下&#xff0c;以帮助想学者和初学者。还有朋友不知道知识兔吗&#xff1f;知识兔就等于学习&#xff0c;公主号超乎想象&#xff0c;学课程&#xff0c;下载…