【发布时间】:2018-06-28 22:47:28
【问题描述】:
我有一个具有多个 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 配置连接到一个在本地运行但具有不同数据库的实例。我也尝试过使用不同的地址,但它的行为相同。
无论如何,这将通过实体和 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 应该写入和读取哪个数据库?
【问题讨论】:
-
为什么两个配置同时激活?
-
因为两者都被使用了......一些组件与一个数据库交互,一些与另一个交互......我想在示例中调用一个“测试”可能是个坏主意。把它想象成“app1”和“app2”
-
尝试将@ConfigurationProperties 放在bean 而不是配置类上。因为它是 bean 将从属性文件中获取配置属性
-
@deepansh2323 我不明白...我不是要告诉组件使用特定的配置前缀,而是要告诉存储库使用哪个 MongoTemplate
标签: java spring-boot spring-data-mongodb