我有一个具有多个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
注释的对象。此外,如果我在ThingDoer上添加@EnableMongoRepositories
批注,例如:
@EnableMongoRepositories(basePackages={"com.whatever.package"}, mongoTemplateRef="appMongoTemplate")
它仍然不起作用。仍然会写入“ test”引用的数据库。
如果我直接在MongoTemplate中@Autowire
并使用它,它将按我期望的那样工作。事情去了“应用程序”回购。我该如何告诉它应该向哪个数据库写入和读取TestObjRepository?
答案 0 :(得分:0)
因此,如果还有其他人仍然有此问题,则解决方法是:
@EnableMongoRepositories(basePackages={"com.whatever.package"}, mongoTemplateRef="appMongoTemplate")
您必须将其放在自定义mongo属性上。 其中basePackages是您的存储库的软件包路径。每个mongo数据库都必须有一个软件包,因此它将查找所需的存储库和模型参考。 使用多个数据库时,还必须在春季之前禁用mongo自动配置:
spring.autoconfigure.exclude:org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
这是一个很棒的教程: https://dzone.com/articles/multiple-mongodb-connectors-with-spring-boot