如何在春季数据中为类配置 MongoDb 集合名称

我的MongoDB数据库中有一个调用的集合,它由我的Java代码中的接口表示。以下存储库声明会导致 Spring Date 查找集合 。ProductsIProductPricedb.collection: Intelliprice.iProductPrice

我希望它配置它以使用外部配置进行查找,而不是在 上放置注释。这可能吗?我该怎么做?db.collection: Intelliprice.Products@Collection(..)IProductPrice

public interface ProductsRepository extends
    MongoRepository<IProductPrice, String> {
}

答案 1

您当前可以实现此目的的唯一方法是使用该属性来批注您的域类,以定义此类的集合实例的名称。@Documentcollection

但是,有一个 JIRA 问题,建议添加一个可插入的命名策略,以配置以更全局的方式处理类、集合和属性名称的方式。随时评论您的用例并投票。


答案 2

使用上面Oliver Gierke的答案,在一个需要为一个实体创建多个集合的项目上,我想使用弹簧存储库,并且需要在使用存储库之前指定要使用的实体。

我设法使用此系统按需修改存储库集合名称,它使用SPeL。不过,您一次只能处理 1 个集合。

域对象

@Document(collection = "#{personRepository.getCollectionName()}")
public class Person{}

默认的弹簧存储库:

public interface PersonRepository 
     extends MongoRepository<Person, String>, PersonRepositoryCustom{
}

自定义存储库接口:

public interface PersonRepositoryCustom {
    String getCollectionName();

    void setCollectionName(String collectionName);
}

实现:

public class PersonRepositoryImpl implements PersonRepositoryCustom {

    private static String collectionName = "Person";

    @Override
    public String getCollectionName() {
        return collectionName;
    }

    @Override
    public void setCollectionName(String collectionName) {
        this.collectionName = collectionName;
    }
}

要使用它:

@Autowired
PersonRepository personRepository;

public void testRetrievePeopleFrom2SeparateCollectionsWithSpringRepo(){
        List<Person> people = new ArrayList<>();
        personRepository.setCollectionName("collectionA");
        people.addAll(personRepository.findAll());
        personDocumentRepository.setCollectionName("collectionB");
        people.addAll(personRepository.findAll());
        Assert.assertEquals(4, people.size());
}

否则,如果您需要使用配置变量,则可以使用类似这样的东西?

@Value("#{systemProperties['pop3.port'] ?: 25}")