wake-up-neo.com

So konfigurieren Sie den MongoDb-Sammlungsnamen für eine Klasse in Spring Data

Ich habe eine Sammlung namens Products in meiner MongoDB-Datenbank, die von der Schnittstelle IProductPrice in meinem Java-Code dargestellt wird. Die folgende Repository-Deklaration bewirkt, dass Spring Date auf die Auflistung db.collection: Intelliprice.iProductPrice schaut.

Ich möchte, dass es so konfiguriert wird, dass es in db.collection: Intelliprice.Products mithilfe einer externen Konfiguration sucht, anstatt eine @Collection(..)-Anmerkung in IProductPrice zu setzen. Ist das möglich? Wie kann ich das machen?

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

Sie können dies derzeit nur erreichen, indem Sie Ihre Domain-Klasse mit @Document unter Verwendung der collection-Eigenschaft versehen, um den Namen der Auflistungsinstanzen dieser Klasse festzulegen, für die die persistente Klasse beibehalten wird.

Es gibt jedoch ein JIRA-Problem open, das vorschlägt, eine steckbare Namensstrategie hinzuzufügen, um die Art und Weise zu konfigurieren, wie Klassen-, Collection- und Eigenschaftsnamen globaler behandelt werden. Fühlen Sie sich frei, Ihren Anwendungsfall zu kommentieren und abzustimmen.

15
Oliver Drotbohm

mit der Antwort von Oliver Gierke oben, in einem Projekt, in dem ich mehrere Sammlungen für eine Entität erstellen muss, wollte ich die Feder-Repositories verwenden und musste die Entität angeben, die vor der Verwendung des Repositorys verwendet werden soll. 

Es ist mir gelungen, den Namen der Repository-Sammlung bei Bedarf mit diesem System, mit SPeL, zu ändern. Sie können jedoch jeweils nur an einer Sammlung arbeiten.

Domain-Objekt

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

Standard Spring Repository:

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

Benutzerdefinierte Repository-Schnittstelle:

public interface PersonRepositoryCustom {
    String getCollectionName();

    void setCollectionName(String collectionName);
}

implementierung:

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

Um es zu benutzen:

@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());
}

Andernfalls, wenn Sie Konfigurationsvariablen verwenden müssen, könnten Sie vielleicht so etwas verwenden? Quelle

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

Der einzige Kommentar, den ich hinzufügen kann, ist, dass Sie dem Bean-Namen ein @-Präfix hinzufügen müssen:

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

für die Bohnenfabrik, um die Bohne zu spritzen:

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

}

Ich bemühte mich, es herauszufinden ..

VOLLSTÄNDIGES BEISPIEL

@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);
}

verwendung in 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