Springboot集成MongoDb多数据源(五)

上一章已经介绍了MongoDb介绍以及集成,现在进行MongoDb多数据源的讲解。


1、pom包配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>RELEASE</version>
</dependency>

2、配置文件application.properties形式添加两条数据源,如下

mongodb.first.host = 127.0.0.1
mongodb.first.port = 27017
mongodb.first.database = multi1
mongodb.second.host = 127.0.0.1
mongodb.second.port = 27017
mongodb.second.database = multi2


3、配置两个库的数据源

  3.1 封装读取以mongodb开头的两个配置文件,注意此@ConfigurationProperties对应的mongodb与数据源中对应。

     prefix = "mongodb :加载配置文件分隔符

     new MongoProperties():直接加载配置文件类

@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {

    private MongoProperties first = new MongoProperties();
    private MongoProperties second = new MongoProperties();

    public MongoProperties getFirst() {
        return first;
    }

    public void setFirst(MongoProperties first) {
        this.first = first;
    }

    public MongoProperties getSecond() {
        return second;
    }

    public void setSecond(MongoProperties second) {
        this.second = second;
    }
}

3.2 配置不同包路径下使用不同的数据源

第一个库的封装

@Configuration
@EnableMongoRepositories(basePackages = "com.example.multipledsmongodb.model.first",
        mongoTemplateRef = FirstMongoConfig.MONGO_TEMPLATE)
public class FirstMongoConfig {
    protected static final String MONGO_TEMPLATE = "firstMongoTemplate";
}

第二个库的封装

@Configuration
@EnableMongoRepositories(basePackages = "com.example.multipledsmongodb.model.second",
        mongoTemplateRef = SencondMongoConfig.MONGO_TEMPLATE)
public class SencondMongoConfig {
    protected static final String MONGO_TEMPLATE = "sencondMongoTemplate";
}

3.3 读取对应的配置信息并且构造对应的MongoTemplate 

@Configuration
public class MultipleMongoConfig {
    @Autowired
    private MultipleMongoProperties mongoProperties;

    @Primary
    @Bean(name = FirstMongoConfig.MONGO_TEMPLATE)
    public MongoTemplate firstMongoTemplate() throws Exception {
        return new MongoTemplate(primaryFactory(this.mongoProperties.getFirst()));
    }

    @Bean
    @Qualifier(SencondMongoConfig.MONGO_TEMPLATE)
    public MongoTemplate sencondMongoTemplate() throws Exception {
        return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecond()));
    }

    @Bean
    @Primary
    public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
        return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                mongo.getDatabase());
    }

    @Bean
    public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
        return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                mongo.getDatabase());
    }
}

两个库的配置信息已经完成。


4、创建两个库分别对应的对象和Repository

@Document(collection = "first_obj")
public class FirstObj {
    @Id
    private String id;

    private String value;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public FirstObj(String id, String value) {
        this.id = id;
        this.value = value;
    }

    @Override
    public String toString() {
        return "FirstObj{" +
                "id='" + id + '\'' +
                ", value='" + value + '\'' +
                '}';
    }
}

对应的Repository

public interface FirstRepository extends MongoRepository<FirstObj, String> {
}

继承了 MongoRepository 会默认实现很多基本的增删改查,省了很多自己写dao层的代码。

Second和上面的代码类似就不贴出来了


5、最后测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class MultipleDataSourceTest {
    @Autowired
    private FirstRepository firstRepository;
    @Autowired
    private SecondRepository secondRepository;

    @Test
    public void save() {
        this.firstRepository
                .save(new FirstObj(null, "第一个库的对象"));

        this.secondRepository
                .save(new SecondObj(null, "第二个库的对象"));

        List<FirstObj> primaries = this.firstRepository.findAll();
        for (FirstObj primary : primaries) {
            System.out.println(primary.toString());
        }

        List<SecondObj> secondaries = this.secondRepository.findAll();

        for (SecondObj secondary : secondaries) {
            System.out.println(secondary.toString());
        }
    }
}

执行@Test注解的方法后

Springboot集成MongoDb多数据源(五)

打开Robo 3T查看信息如下:

Springboot集成MongoDb多数据源(五)

多数据源就此完毕,谢谢!


6、遇到的问题

     6.1 报Consider defining a bean of type com.xxRepository'in your configuration

     原因:发现在启动类中缺少注解@EnableTransactionManagement

    6.2  ....nested exception is java.lang.NullPointerException

     可能原因:在新建的MultipleMongoProperties里,@ConfigurationProperties(prefix = "mongodb")的注解的mongodb要和数据源配置一致,并且new的对像的引用也要保持一致。

  Springboot集成MongoDb多数据源(五)

 7、最后

       参考文档:https://blog.****.net/a123demi/article/details/78239251

       demo地址:https://github.com/xuhuaguang/multipleds-mongodb.git