Dav*_*nce 2 spring mongodb spring-data spring-data-mongodb
在过去的一周中,我一直在努力将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");
}
}
Run Code Online (Sandbox Code Playgroud)
这是其他单个存储库配置之一:
@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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在这是RegisteredCard存储库的实际存储库定义:
@Repository
public interface RegisteredCardRepository extends MongoRepository<RegisteredCard, Guid>,
QueryDslPredicateExecutor<RegisteredCard> { }
Run Code Online (Sandbox Code Playgroud)
这一切对我来说都是非常合理的,各个配置通过注释的参数唯一地标识它们配置的特定存储库接口以及要与该存储库一起使用的特定模板Bean mongoTemplateRef。至少,这就是文档似乎暗示它应该起作用的方式。
实际上,当我启动该应用程序时,RegisteredCard存储库解析为一个MongoDB存储库实例,该实例具有MongoDbFactory绑定到TenantConfiguration数据库的关联对象。实际上,每个单独的存储库都会收到相同的,错误的MongoOperations对象。尽管每个存储库都有其自己独特的配置,但似乎首先访问的数据库仍然是每个存储库的目标数据库。
有解决此问题的解决方案吗?
我花了将近一个星期的时间,但实际上我已经找到了解决该问题的可行方法。这是我在研究此问题时掌握的事实的简要摘要:
@EnableMongoRepositories(basePackageClasses = Whatever.class)只需使用合格的类名来指示应为您定义的所有数据模型扫描哪个程序包。这是完全等同于做,如果驻留在包中。@EnableMongoRepositories(basePackageClasses = "com.mypackage.whatevers")Whatever.class@EnableMongoRepositories是不可重复的,但可用于注释几个类。其他SO对话中已经讨论了这一点,但这里需要重复。您将需要定义几个存储库配置类。一个与您要交互的每个数据库。MongoTemplate在@EnableMongoRepositories注释中指定其自己的实例。您可以只提供一个Mongobean,但要MongoTemplate依赖于特定的bean MongoMappingContext。@EnableMongoRepositories注释有助于定义映射背景下,这种理解你的数据模型的结构,以及如何序列化。它还了解@Document和@Field注释,并且可以很持久地保存对象。您可以在Mongo模板实例中指定要与之交互的数据库。因此,通过为@EnableMongoRepositories注释同时提供basePackage属性和mongoTemplateRef属性,您可以告诉Spring Data Mongo“采用这些模型并将其保存在此特定数据库中”。此解决方案的不幸要求是,您必须根据数据模型所属的数据库将数据模型组织到单独的包中。对于访问量大的集合),这意味着您的每个数据模型都必须驻留在自己的包中。这些软件包中的每一个都必须由一个@EnableMongoRepositories注释指向,该注释还包含mongoTemplateRef一个唯一MongoTemplatebean 的属性。
我希望这可以帮助某人避免尝试完成应有的Mongo集成时遇到的麻烦。
PS:放弃所有希望,将审核与此配置结合起来的人们。
| 归档时间: |
|
| 查看次数: |
1258 次 |
| 最近记录: |