我有一个应用程序有多个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
,因为它是用@Prime
注释的对象。此外,如果我在ThingDoer上添加@EnableMongoRepositories
注释,例如:
@EnableMongoRepositories(basePackages={"com.whatever.package"}, mongoTemplateRef="appMongoTemplate")
它仍然不起作用。它仍然写入“test”引用的db。
如果我直接在MongoTemplate中@Autowire
,并使用它,它就会像我预期的那样工作。所有东西都会被“应用”回购。我如何告诉它TestObjRepository应该向哪个数据库写入数据和从哪个数据库读取数据?
因此,如果其他人仍然有这个问题,解决方案是:
@EnableMongoRepositories(basePackages={"com.whatever.package"}, mongoTemplateRef="appMongoTemplate")
你必须把它放在你的自定义mongo属性上。其中basePackages是您的回购协议的包路径。每个mongo数据库都必须有一个包,因此它会查找预期的存储库和模型引用。当使用多个DBs时,您还必须在spring之前禁用mongo自动配置:
spring。自动配置。排除:org。springframework。靴子自动配置。蒙戈。Mongouto配置
这是一个很棒的教程:https://dzone.com/articles/multiple-mongodb-connectors-with-spring-boot
我正在尝试使用@Query注释从Spring Boot MongoRepository执行一个复杂的GeoQuery。以下是我的文档: 我需要我的查询执行以下任务: null
我在GET api中有多个查询参数(如姓名、年龄、性别、位置等…n个数字)。现在我需要使用这些查询值来查询我的mongo数据库。现在用户可以发送从0到n的查询参数。 我正在尝试使用类似的东西 或者 但问题是,考虑到用户可以发送的所有排列和组合,我将不得不编写多个查询。有没有更好的方法来做到这一点?
问题内容: 我有一个已删除的文件,但仍保持打开程序的状态。我使用lsof找到了索引节点号。如何创建硬链接回到该索引节点? 任何代码都会有所帮助,但是Perl会很方便。 问题答案: 从/ proc / pid / fd / 文件描述符 复制 __ 使用lsof查找pid和文件描述符。
我是Android开发新手。 如何直接滚动到活动中的特定部分?我在活动中使用了WebView。 示例:以下是我的活动中的数据: 一月二月三月四月五月六月七月八月九月十月十一月十二月。 我希望我的活动在10月份直接滚动。怎么做?提前谢谢。
问题内容: 当输入零作为输入时,我需要停止询问整数输入,并立即开始求和。当我键入零时,我的程序不会停止。我需要它停止并开始汇总它收集的所有输入。 这是我所拥有的: ///////////////有效的最终代码。谢谢!公共类Inttosum { 问题答案: 您正在使用一种称为循环条件的东西,但是在循环中更新了变量。您可以使用循环。更改 像 使用 我也建议先打电话再打电话。而且,由于您不使用(只是),
问题内容: 我正在尝试编写一个数字猜测程序,如下所示: 我现在想做的是让if / elif / else命令序列循环执行,直到用户输入“正确”为止,即程序声明的数字大约等于用户数,但是如果我不知道用户数量,我无法想到如何实现和if语句,并且尝试使用“ while”也无效。 问题答案: 作为@Mark Byers方法的替代方法,可以使用: