【问题标题】:Specify MongoDb collection name at runtime in Spring boot在 Spring boot 运行时指定 MongoDb 集合名称
【发布时间】:2015-06-24 06:27:38
【问题描述】:

我正在尝试在两个不同的微服务中重用我现有的 EmployeeRepository 代码(见下文),以将数据存储在两个不同的集合中(在同一个数据库中)。

@Document(collection = "employee")
public interface EmployeeRepository extends MongoRepository<Employee, String> 

是否可以修改@Document(collection = "employee") 以接受运行时参数?例如类似@Document(collection = ${COLLECTION_NAME})

您会推荐这种方法还是应该创建一个新的存储库?

【问题讨论】:

    标签: java spring mongodb spring-boot


    【解决方案1】:

    这是一个非常老的帖子,但我会在这里添加一些更好的信息,以防其他人发现这个讨论,因为事情比接受的答案声称的要灵活一些。

    您可以为集合名称使用表达式,因为 spel 是解析集合名称的可接受方式。例如,如果您的 application.properties 文件中有这样的属性:

    mongo.collection.name = my_docs
    

    如果你在你的配置类中为这个属性创建一个 spring bean,如下所示:

    @Bean("myDocumentCollection")
    public String mongoCollectionName(@Value("${mongo.collection.name}") final String collectionName) {
        return collectionName
    }
    

    然后您可以将其用作持久性文档模型的集合名称,如下所示:

    @Document(collection = "#{@myDocumentCollection}")
    public class SomeModel {
        @Id
        private String id;
        // other members and accessors/mutators
        // omitted for brevity
    }
    

    【讨论】:

      【解决方案2】:

      这应该是不可能的,文档指出集合字段应该是集合名称,因此不是表达式: http://docs.spring.io/spring-data/data-mongodb/docs/current/api/org/springframework/data/mongodb/core/mapping/Document.html

      就您的其他问题而言-即使可以传递表达式,我也建议创建一个新的存储库类-代码重复也不错,而且您的微服务可能需要执行不同的查询和单个存储库类方法会迫使您将所有微服务的查询方法保留在同一个接口中,这不是很干净。

      看看这个视频,他们列出了一些非常有趣的方法:http://www.infoq.com/presentations/Micro-Services

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        • 2014-06-22
        相关资源
        最近更新 更多