java - SpringBoot 将 MongoRepository 指向特定的 MongoTemplate
问题描述
我有一个具有多个 mongo 配置的应用程序。这是通过像这样的一些@Configuration 类来实现的
public abstract class AbstractMongoConfig {
private String database;
private String uri;
public void setUri(String uri) {
this.uri = uri;
}
public void setDatabase(String database) {
this.database = database;
}
public MongoDbFactory mongoDbFactory() throws Exception {
return new SimpleMongoDbFactory(new MongoClient(new MongoClientURI(this.uri)), this.database);
}
abstract public MongoTemplate getMongoTemplate() throws Exception;
}
配置 1——应用
@Configuration
@ConfigurationProperties(prefix="app.mongodb")
public class AppMongoConfig extends AbstractMongoConfig {
@Primary
@Override
@Bean(name="appMongoTemplate")
public MongoTemplate getMongoTemplate() throws Exception {
return new MongoTemplate(mongoDbFactory());
}
}
配置 2 -- 测试
@Configuration
@ConfigurationProperties(prefix="test.mongodb")
public class TestMongoConfig extends AbstractMongoConfig {
@Override
@Bean(name="testMongoTemplate")
public MongoTemplate getMongoTemplate() throws Exception {
return new MongoTemplate(mongoDbFactory());
}
}
然后在我的属性中
test.mongodb.uri=mongodb://127.0.0.1/test
test.mongodb.database=test
app.mongodb.uri=mongodb://127.0.0.1/app
app.mongodb.database=app
因此,两个 mongo 配置连接到在本地运行但具有不同数据库的实例。我也尝试过使用不同的地址,但它的行为相同。
无论如何,然后通过 Entity 和 MongoRepository 使用它
@Document(collection="collname")
public class TestObj {
@Id
private String id;
private String username;
private int age;
// getters & setters
}
回购
@Repository
public interface TestObjRepository extends MongoRepository<TestObj, String> {
public TestObj findByUsername(String username);
}
但是,当我在某个班级的某个地方使用它时
@Service
public class ThingDoer {
@Autowired
TestObjRepository toRepo;
public void doStuff() {
TestObj to = new TestObj("name", 123);
toRepo.save(to);
}
}
这个对象被写入了TestMongoConfig
一个不是AppMongoConfig
我所期望的对象,因为那是一个用@Primary
. 此外,如果我@EnableMongoRepositories
在 ThingDoer 上添加注释,例如:
@EnableMongoRepositories(basePackages={"com.whatever.package"}, mongoTemplateRef="appMongoTemplate")
它仍然不起作用。它仍然写入“test”引用的数据库。
如果我@Autowire
直接在 MongoTemplate 中使用它,它会按我的预期工作。事情去“应用程序”回购。我如何告诉它 TestObjRepository 应该写入和读取哪个数据库?
解决方案
所以,如果其他人仍然有这个问题,解决方案是这样的:
@EnableMongoRepositories(basePackages={"com.whatever.package"}, mongoTemplateRef="appMongoTemplate")
你必须把它放在你的自定义 mongo 属性上。其中 basePackages 是你的仓库的包路径。每个 mongo 数据库都必须有一个包,因此它会查找预期的存储库和模型参考。在使用多个数据库时,您还必须在 spring 之前禁用 mongo 自动配置:
spring.autoconfigure.exclude:org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
这是一个很棒的教程: https ://dzone.com/articles/multiple-mongodb-connectors-with-spring-boot
推荐阅读
- amp-html - AMP 域“ampproject.org”不再可用
- git - 为什么 GitKraken 快速转发功能会合并到开发分支中?
- sql - 从 xml 路径中删除尾随逗号
- typescript - TypeScript 和非泛型类型参数
- excel - 在 VBA for Excel 中尝试基于变量将数据从一个 WB 复制到另一个
- bash - 不能在 xargs 中使用环境变量
- git - 项目层次结构中缺少预制件
- python - 如何使用 python selenium 获取所有推文?
- authentication - 我可以通过 cookie 在 Analytics 中注册用户吗?
- javascript - 本地进度条码在 CodePen 上正常工作时出现问题?