web-dev-qa-db-fra.com

Comment configurer le nom de collection MongoDb pour une classe dans les données de printemps

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> {
}
17
Danish

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.

15
Oliver Drotbohm

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

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;
}
0
ylev