-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
I have a multi-module maven project split up by domains (as in domain-driven design). A requirement is that each domain has its own database. To reduce costs, the decision was made at this stage to keep each database running on a single Mongo server but having its own configuration.
I've included two sample configurations below, but there are a few more.
The issue I'm facing is that all the collections are being created in each database. e.g. the database for Domain A will also have the collections for Domain B, C and D. Domain B will have the collections for A, C and D, and so on.
The data is being persisted to the correct collection, and all the "redundant" collections are empty. I would like to figure out how to resolve this issue so that each database only has the collections for it's associated entities.
Domain A config
@Configuration
@EnableMongoRepositories(
basePackageClasses = {DomainAMongoRepository.class},
mongoTemplateRef = "domainAMongoTemplate")
@Slf4j
@EnableConfigurationProperties(DomainADbMongoConfiguration.class)
public class DomainADbConfig extends AbstractMongoClientConfiguration {
private final DomainADbMongoConfiguration mongoConfiguration;
@Autowired
public DomainADbConfig(DomainADbMongoConfiguration mongoConfiguration) {
this.mongoConfiguration = mongoConfiguration;
}
@Primary
@Bean(name = "domainAMongoTemplate")
public MongoTemplate domainAMongoTemplate(
@Qualifier("domainAMongoDbFactory") MongoDatabaseFactory mongoDbFactory,
@Qualifier("domainAMongoConverter") MappingMongoConverter mongoConverter
) {
return new MongoTemplate(mongoDbFactory, mongoConverter);
}
@Primary
@Bean(name = "domainAMongoDbFactory")
public MongoDatabaseFactory mongoDbFactory(
@Qualifier("domainAMongoClient") MongoClient mongoClient
) {
return new SimpleMongoClientDatabaseFactory(mongoClient, getDatabaseName());
}
@Primary
@Bean(name = "domainAMongoConverter")
public MappingMongoConverter mongoConverter() throws Exception {
MongoMappingContext mongoMappingContext =
mongoMappingContext(customConversions(), mongoManagedTypes());
mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
mongoMappingContext.afterPropertiesSet();
MappingMongoConverter converter =
new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory()), mongoMappingContext);
converter.setCustomConversions(customConversions());
converter.afterPropertiesSet();
return converter;
}
@Override
@Bean(name = "domainAMongoClient")
@Primary
public MongoClient mongoClient() {
return MongoClients.create(
MongoClientSettings.builder()
.uuidRepresentation(UuidRepresentation.JAVA_LEGACY)
.applyConnectionString(new ConnectionString(mongoConfiguration.getUri()))
.build());
}
@Override
protected String getDatabaseName() {
return mongoConfiguration.getDatabase();
}
}
@ConfigurationProperties("domain-a.mongo")
class DomainADbMongoConfiguration {
private String database;
private String uri;
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
}
}
Domain B config
@Configuration
@EnableMongoRepositories(
basePackageClasses = {DomainBTypeMongoRepository.class, DomainBMongoRepository.class},
mongoTemplateRef = "domainBMongoTemplate")
@Slf4j
@EnableConfigurationProperties(DomainBDbMongoConfiguration.class)
public class DomainBDbConfig extends AbstractMongoClientConfiguration {
private final DomainBDbMongoConfiguration mongoConfiguration;
@Autowired
public DomainBDbConfig(DomainBDbMongoConfiguration mongoConfiguration) {
this.mongoConfiguration = mongoConfiguration;
}
@Bean(name = "domainBMongoTemplate")
public MongoTemplate topicMongoTemplate(
@Qualifier("domainBMongoDbFactory") MongoDatabaseFactory domainBMongoDbFactory,
@Qualifier("domainBMongoConverter") MappingMongoConverter domainBMongoConverter) {
log.info("Connecting to Mongo DomainBs db");
return new MongoTemplate(domainBMongoDbFactory, domainBMongoConverter);
}
@Bean(name = "domainBMongoDbFactory")
public MongoDatabaseFactory mongoDbFactory(
@Qualifier("domainBMongoClient") MongoClient mongoClient) {
return new SimpleMongoClientDatabaseFactory(mongoClient, getDatabaseName());
}
@Bean(name = "domainBMongoConverter")
public MappingMongoConverter mongoConverter(
@Qualifier("domainBMongoDbFactory") MongoDatabaseFactory domainBMongoDbFactory) throws Exception {
MongoMappingContext mongoMappingContext =
mongoMappingContext(customConversions(), mongoManagedTypes());
mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
mongoMappingContext.afterPropertiesSet();
MappingMongoConverter converter =
new MappingMongoConverter(
new DefaultDbRefResolver(domainBMongoDbFactory), mongoMappingContext);
converter.setCustomConversions(customConversions());
converter.afterPropertiesSet();
return converter;
}
@Override
@Bean(name = "domainBMongoClient")
public MongoClient mongoClient() {
return MongoClients.create(
MongoClientSettings.builder()
.uuidRepresentation(UuidRepresentation.JAVA_LEGACY)
.applyConnectionString(new ConnectionString(mongoConfiguration.getUri()))
.build());
}
@Override
protected boolean autoIndexCreation() {
return true;
}
@Override
protected String getDatabaseName() {
return mongoConfiguration.getDatabase();
}
}
@ConfigurationProperties("domainBs.mongo")
class DomainBDbMongoConfiguration {
private String uri;
private String database;
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
}