当前位置: 首页 > 知识库问答 >
问题:

SpringBoot直接MongoRepository到特定MongoTemplate

云宜人
2023-03-14

我有一个应用程序有多个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应该向哪个数据库写入数据和从哪个数据库读取数据?

共有1个答案

雍光远
2023-03-14

因此,如果其他人仍然有这个问题,解决方案是:

@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方法的替代方法,可以使用: