J'ai une collection appelée Products
dans ma base de données MongoDB, qui est représentée par l'interface IProductPrice
dans mon code Java. La déclaration suivante du référentiel force Spring Date à rechercher la collection db.collection: Intelliprice.iProductPrice
.
Je veux le configurer pour qu'il regarde dans db.collection: Intelliprice.Products
en utilisant une configuration externe plutôt que de mettre une annotation @Collection(..)
sur IProductPrice
. Est-ce possible? Comment puis-je faire ceci?
public interface ProductsRepository extends
MongoRepository<IProductPrice, String> {
}
Pour ce faire, vous ne pouvez actuellement y parvenir qu'en annotant votre classe de domaine avec @Document
à l'aide de la propriété collection
afin de définir le nom des instances de collection de cette classe.
Cependant, il existe un problème JIRA open qui suggère l’ajout d’une stratégie de nommage enfichable pour configurer la manière dont les noms de classe, de collection et de propriété sont gérés de manière plus globale. N'hésitez pas à commenter votre cas d'utilisation et à le voter.
en utilisant la réponse d'Oliver Gierke ci-dessus, travaillant sur un projet où je dois créer plusieurs collections pour une entité, je voulais utiliser les référentiels Spring et je devais spécifier l'entité à utiliser avant d'utiliser le référentiel.
J'ai réussi à modifier le nom de la collection du référentiel à la demande à l'aide de ce système, et de SPeL. Cependant, vous ne pouvez travailler que sur 1 collection à la fois.
Objet de domaine
@Document(collection = "#{personRepository.getCollectionName()}")
public class Person{}
Dépôt Spring par défaut:
public interface PersonRepository
extends MongoRepository<Person, String>, PersonRepositoryCustom{
}
Interface de référentiel personnalisé:
public interface PersonRepositoryCustom {
String getCollectionName();
void setCollectionName(String collectionName);
}
la mise en oeuvre:
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;
}
}
Pour l'utiliser:
@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());
}
Sinon, si vous devez utiliser des variables de configuration, vous pourriez peut-être utiliser quelque chose comme ceci? la source
@Value("#{systemProperties['pop3.port'] ?: 25}")
Le seul commentaire que je puisse ajouter est que vous devez ajouter le préfixe @ au nom du bean:
collection = "#{@beanName.method()}"
pour l'usine de haricots à injecter le haricot:
@Document(collection = "#{@configRepositoryCustom.getCollectionName()}")
public class Config {
}
J'ai eu du mal à le comprendre ..
EXEMPLE COMPLET:
@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);
}
utilisation dans 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;
}