我有一个集合称为Products
在我的MongoDB数据库,它是由接口代表IProductPrice
在我的Java代码。 以下库声明导致春季日期查找到集合db.collection: Intelliprice.iProductPrice
。
我想它来配置它在寻找db.collection: Intelliprice.Products
使用外部配置,而不是把一个@Collection(..)
上标注IProductPrice
。 这可能吗? 我怎样才能做到这一点?
public interface ProductsRepository extends
MongoRepository<IProductPrice, String> {
}
目前可以做到这一点的唯一方法是通过注解你的领域类@Document
使用collection
属性来定义这个类的集合实例,应坚持以的名字。
然而,有一个JIRA问题打开该建议将配置在更全局的方式方法类,集合和属性名办理了可插拔的命名策略。 随意评论你的使用情况,并投上一票。
使用答案从奥利弗·基尔克以上,上一个项目,我需要为一个实体创建多个集合的工作,我想用弹簧库和需要指定实体使用存储库之前使用。
我设法使用这个系统来修改需求库集合名称,它使用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}")
我可以添加唯一的评论是,你必须为@添加前缀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;
}