1

I am using spring-data mongo repositories and spring boot in my application. For a single database, I add the db configuration in application.properties. If i need to add another database, how do I add it? And how do I tell spring which data models / repositories are for which database?

thanks!

nate grant
  • 11
  • 1
  • I think this is already answered. Check http://stackoverflow.com/questions/27614301/spring-boot-multiple-datasource – Bhargav May 10 '17 at 04:51
  • See [this Github repository](https://github.com/binarycodifier/multiple-mongodb-databases-using-spring-data) for an example. – manish May 10 '17 at 06:43
  • Possible duplicate of [Spring Boot Configure and Use Two DataSources](http://stackoverflow.com/questions/30337582/spring-boot-configure-and-use-two-datasources) – Mickael May 10 '17 at 08:28

1 Answers1

0

Here is a sample.

//This is like a base class for all your mongoconfigs.   

    public class MongoConfig  {
    private static final Logger LOG = LoggerFactory.getLogger(MongoConfig.class);

    @NoArgsConstructor
    @Getter
    @Setter
    class MongoDbProperties{
        private String host;
        private int port;
        private String dbName;
        private String dbUser;
        private String dbPwd;
    }

    Mongo createMongoClient(ServerAddress serverAddress, MongoCredential... credentials) {

        if (credentials != null && credentials.length > 0) {

            final List<MongoCredential> credentialList = new ArrayList<>();
            credentialList.addAll(Arrays.asList(credentials));

            LOG.info("Creating connection with credentials: " + credentialList);

            return new MongoClient(serverAddress, credentialList;

        } else {
            return new MongoClient(serverAddress);
        }
    }

    Mongo getMongoClient(MongoDbProperties mongoDbProperties) {
        LOG.info("Initializing mongo client for {}. Host={}, Port={} ", mongoDbProperties.getDbName(), mongoDbProperties.getHost(), mongoDbProperties.getPort());
        Mongo mongoClient;
        if(!mongoDbProperties.getDbUser().isEmpty() && !mongoDbProperties.getDbPwd().isEmpty()) {
            MongoCredential credential = MongoCredential.createCredential(mongoDbProperties.getDbUser(), mongoDbProperties.getDbName(), mongoDbProperties.getDbPwd().toCharArray());
            mongoClient = createMongoClient(new ServerAddress(mongoDbProperties.getHost(), mongoDbProperties.getPort()), credential);
        }
        else
            mongoClient = createMongoClient(new ServerAddress(mongoDbProperties.getHost(), mongoDbProperties.getPort()));

        LOG.info("Initializing mongo template for products dataBase={} ", mongoDbProperties.getDbName());
        return mongoClient;
    }


    @Bean
    @ConfigurationProperties(prefix = "mongo.default")
    public MongoOptionsProperties defaultMongoOptionsProperties() {
        return new MongoOptionsProperties();
    }
 }

Then have as many config files as mongo databases you want to connect to like these:

@Configuration
@EnableMongoRepositories(basePackages = "com.product.repository.shop.swiss", mongoTemplateRef = "swissMongoProductTemplate")
class SWissProductMongoConfig extends MongoConfig {

    @Bean(name = "swissMongoProductTemplate")
    public MongoTemplate swissMongoProductTemplate() throws Exception {
        MongoDbProperties mongoDbProperties = shopSWissProductMongoProperties();
        Mongo mongoClient = getMongoClient(mongoDbProperties);
        return new MongoTemplate(mongoClient, mongoDbProperties.getDbName());
    }

        @Bean
        @ConfigurationProperties(prefix = "mongo.product.swiss")
        public MongoDbProperties shopSWissProductMongoProperties(){
            return new MongoDbProperties();
        }
    }

and

@Configuration
@EnableMongoRepositories(basePackages = "com.product.repository.shop.france", mongoTemplateRef = "franceMongoProductTemplate")
class SWissProductMongoConfig extends MongoConfig {

    @Bean(name = "franceMongoProductTemplate")
    public MongoTemplate franceMongoProductTemplate() throws Exception {
        MongoDbProperties mongoDbProperties = shopFranceProductMongoProperties();
        Mongo mongoClient = getMongoClient(mongoDbProperties);
        return new MongoTemplate(mongoClient, mongoDbProperties.getDbName());
    }

    @Bean
    @ConfigurationProperties(prefix = "mongo.product.france")
    public MongoDbProperties shopFranceProductMongoProperties() {
        return new MongoDbProperties();
    }
}

Have something like this in your yml

mongo:
  product:
    france :
      dbName: 
      host: 
      port: 
      dbUser:
      dbPwd:
    swiss:
      dbName: 
      host: 
      port: 
      dbUser: 
      dbPwd: 

Make sure you have the repository classes in the packages mentioned in the basePackages attribute of annotaion EnableMongoRepositories

Nicomedes E.
  • 1,326
  • 5
  • 16
  • 26
pvpkiran
  • 20,658
  • 5
  • 57
  • 87