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/collectionName
logging:
level:
org.springframework.data.mongodb.core: debug
然后添加配置类:
package com.xiaomifeng1010.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:
* @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.xiaomifeng1010.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:
* @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
*/
@Override
public Decimal128 convert(BigDecimal source) {
return new Decimal128(source);
}
}
接着是从mongodb读取数据时的读类型转换器
package com.xiaomifeng1010.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:
* @Description mongo--->java 即mongodb中的Decimal128类型转换为为BigDecimal的转换器
*/
@ReadingConverter
public class Decimal128ToBigDecimalConverter implements Converter<Decimal128, BigDecimal> {
@Override
public BigDecimal convert(Decimal128 decimal128) {
return decimal128.bigDecimalValue();
}
}
最后配置多数据源默认使用的mongotemplate,以及将转换器注入到mongotemplate中
package com.xiaomifeng1010.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:
* @Description 本系统mongodb数据源配置
*/
@Configuration
@EnableMongoRepositories(mongoTemplateRef = "mongoTemplate")
public class DefaultMongoTemplateConf {
private final MongoProperties mongoProperties;
public DefaultMongoTemplateConf(@Qualifier("oneMongoProperties") MongoProperties mongoProperties) {
this.mongoProperties = mongoProperties;
}
@Bean
@Primary
public MongoTemplate mongoTemplate() {
MongoTemplate mongoTemplate=new MongoTemplate(mongoDatabaseFactory(mongoProperties));
MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
mongoMapping.setCustomConversions(mongoCustomConversions());
mongoMapping.afterPropertiesSet();
return mongoTemplate;
}
@Bean(name = "oneMongoFactory")
@Primary
public MongoDatabaseFactory mongoDatabaseFactory(MongoProperties mongoProperties) {
return new SimpleMongoClientDatabaseFactory(mongoProperties.getUri());
}
/**
* mongoCustomConversions会由spring进行管理,
* 按照加入的转换器,在数据库读写时对数据类型进行转换
* @return
*/
@Bean
public MongoCustomConversions mongoCustomConversions() {
List<Converter<?, ?>> converterList = new ArrayList<>();
converterList.add(new BigDecimalToDecimal128Converter());
converterList.add(new Decimal128ToBigDecimalConverter());
return new MongoCustomConversions(converterList);
}
}
接着配置第二个数据源的nongotemplate,第二个数据源暂时不涉及金额,所以不用注入转换器
package com.xiaomifeng1010.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:
* @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.xiaomifeng1010.module.xxx.dto.request.*;
import com.xiaomifeng1010.module.xxx.service.SealService;
import com.xiaomifeng1010.module.xxx.util.SealRequestUtil;
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:
* @Description
*/
@Service
@Setter(onMethod_=@Autowired)
@Slf4j
public class SealServiceImpl implements SealService {
private SealRequestUtil sealRequestUtil;
private LoginRequestDTO loginRequestDTO;
@Autowired
@Qualifier("twoMongo")
@Setter(AccessLevel.NONE)
private MongoTemplate twoMongo;
}
然后将BigDecimal类型存入到mongodb时就是Decimal128类型了
在navicat中查看数据:
财务指标中的金额,已经是Decimal128类型了,通过启用类型颜色标识,紫色标识Decimal128可知。