【发布时间】:2016-10-31 08:59:30
【问题描述】:
过去一周我一直在努力将 Spring Data MongoDB 成功集成到我们的应用程序中。我们使用相当普遍的做法,即为我们所依赖的每个集合设置单独的数据库。例如,TenantConfiguration 数据库仅包含 TenantConfigurations 集合。
我已多次阅读文档并浏览代码以寻求解决方案,但一无所获。这样一个被广泛采用的项目肯定有解决这个问题的办法吗?我目前的尝试是这样的:
@Configuration
@EnableMongoRepositories(basePackages = "com.whatever.service.repository",
basePackageClasses = TenantConfigurationRepository.class,
mongoTemplateRef = "tenantConfigurationTemplate")
public class TenantConfigurationRepositoryConfig {
@Value("${mongo.hosts}")
private List<String> mongoHosts;
@Bean
public MongoTemplate tenantConfigurationTemplate() throws Exception {
final List<ServerAddress> serverAddresses = new ArrayList<>();
for (String host : mongoHosts) {
serverAddresses.add(new ServerAddress(host, 27017));
}
final MongoClientOptions clientOptions = new MongoClientOptions.Builder()
.connectTimeout(25000)
.readPreference(ReadPreference.primaryPreferred())
.build();
final MongoClient client = new MongoClient(serverAddresses, clientOptions);
return new MongoTemplate(client, "TenantConfiguration");
}
}
这是其他单独的存储库配置之一:
@Configuration
@EnableMongoRepositories(basePackages = "com.whatever.service.repository",
basePackageClasses = RegisteredCardRepository.class,
mongoTemplateRef = "registeredCardTemplate")
public class RegisteredCardRepositoryConfig {
@Value("${mongo.hosts}")
private List<String> mongoHosts;
@Bean
public MongoTemplate registeredCardTemplate() throws Exception {
final List<ServerAddress> serverAddresses = new ArrayList<>();
for (String host : mongoHosts) {
serverAddresses.add(new ServerAddress(host, 27017));
}
final MongoClientOptions clientOptions = new MongoClientOptions.Builder()
.connectTimeout(25000)
.readPreference(ReadPreference.primaryPreferred())
.build();
final MongoClient client = new MongoClient(serverAddresses, clientOptions);
return new MongoTemplate(client, "RegisteredCard");
}
}
现在这里是 RegisteredCard 存储库的实际存储库定义:
@Repository
public interface RegisteredCardRepository extends MongoRepository<RegisteredCard, Guid>,
QueryDslPredicateExecutor<RegisteredCard> { }
这一切对我来说都很有意义,各个配置唯一地标识了他们配置的特定存储库接口以及通过@987654324与该存储库一起使用的特定模板bean @注解的参数。至少,文档似乎暗示它应该是这样工作的。
实际上,当我启动应用程序时,RegisteredCard 存储库解析为一个 MongoDB 存储库实例,该实例具有关联的 MongoDbFactory,该实例绑定到 TenantConfiguration 数据库。事实上,每个存储库都会收到相同的、不正确的 MongoOperations 对象。尽管每个存储库都有自己独特的配置,但似乎首先访问的任何数据库仍然是 每个 存储库的目标数据库。
是否有任何解决方案可以解决这个问题?
【问题讨论】:
标签: spring mongodb spring-data spring-data-mongodb