如何配置MongoDB的集合名称对于春季数据的类(How To Configure MongoDb

2019-06-27 20:00发布

我有一个集合称为Products在我的MongoDB数据库,它是由接口代表IProductPrice在我的Java代码。 以下库声明导致春季日期查找到集合db.collection: Intelliprice.iProductPrice

我想它来配置它在寻找db.collection: Intelliprice.Products使用外部配置,而不是把一个@Collection(..)上标注IProductPrice 。 这可能吗? 我怎样才能做到这一点?

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

Answer 1:

目前可以做到这一点的唯一方法是通过注解你的领域类@Document使用collection属性来定义这个类的集合实例,应坚持以的名字。

然而,有一个JIRA问题打开该建议将配置在更全局的方式方法类,集合和属性名办理了可插拔的命名策略。 随意评论你的使用情况,并投上一票。



Answer 2:

使用答案从奥利弗·基尔克以上,上一个项目,我需要为一个实体创建多个集合的工作,我想用弹簧库和需要指定实体使用存储库之前使用。

我设法使用这个系统来修改需求库集合名称,它使用SPEL。 你只能在一个时间上的1分集的工作,虽然。

Domain对象

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

缺省时,Spring库:

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}") 


Answer 3:

我可以添加唯一的评论是,你必须为@添加前缀bean的名字:

collection = "#{@beanName.method()}"

对于bean工厂注入豆:

@Document(collection = "#{@configRepositoryCustom.getCollectionName()}")
public class Config {

}

我挣扎着弄明白..

完整的例子:

@Document(collection = "#{@configRepositoryCustom.getCollectionName()}")
public class Config implements Serializable {
 @Id
 private String uuid;
 private String profile;
 private String domain;
 private String label;
 private Map<String, Object> data;
 // get/set
}

 public interface ConfigRepositoryCustom {
   String getCollectionName();
   void setCollectionName(String collectionName);
 }

@Component("configRepositoryCustom")
public class ConfigRepositoryCustomImpl implements ConfigRepositoryCustom {
 private static String collectionName = "config";
 @Override
 public String getCollectionName() {
  return collectionName;
 }
 @Override
 public void setCollectionName(String collectionName) {
 this.collectionName = collectionName;
 }
}

@Repository("configurations")
public interface ConfigurationRepository extends MongoRepository<Config, String>, ConfigRepositoryCustom {
  public Optional<Config> findOneByUuid(String Uuid);
  public Optional<Config> findOneByProfileAndDomain(String profile, String domain);
}

用法在serviceImpl:

@Service
public class ConfigrationServiceImpl implements ConfigrationService {
 @Autowired
 private ConfigRepositoryCustom configRepositoryCustom;

 @Override
 public Config create(Config configuration) {
   configRepositoryCustom.setCollectionName( configuration.getDomain() ); // set the collection name that comes in my example in class member 'domain'
   Config configDB = configurationRepository.save(configuration);
   return configDB;
}


文章来源: How To Configure MongoDb Collection Name For a Class in Spring Data