在Spring启动时在运行时指定MongoDb集合名称

时间:2015-06-24 06:27:38

标签: java spring mongodb spring-boot

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

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

是否可以修改@Document(collection = "employee")以接受运行时参数?对于例如像@Document(collection = ${COLLECTION_NAME})这样的东西。

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

2 个答案:

答案 0 :(得分:1)

它不应该是可能的,文档说明集合字段应该是集合名称,因此不是表达式: 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

答案 1 :(得分:0)

这是一个非常老的话题,但是如果有人发现此讨论,我会在此处添加一些更好的信息,因为事情要比公认的答案所声称的要灵活一些。

您可以对集合名称使用表达式,因为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
}