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可知。