używając odpowiedzi od Olivera Gierke'a powyżej, pracując nad projektem, w którym potrzebuję utworzyć wiele kolekcji dla jednego podmiotu, chciałem skorzystać z repozytoriów sprężyn i trzeba określić encję do użycia przed użyciem repozytorium.
Udało mi się zmodyfikować nazwę kolekcji repozytorium na żądanie przy użyciu tego systemu, używając SPeL. Możesz pracować tylko w jednej kolekcji na raz.
obiekt Domain Wiosna
@Document(collection = "#{personRepository.getCollectionName()}")
public class Person{}
Domyślnie Repozytorium:
public interface PersonRepository
extends MongoRepository<Person, String>, PersonRepositoryCustom{
}
klienta Repozytorium Interfejs:
public interface PersonRepositoryCustom {
String getCollectionName();
void setCollectionName(String collectionName);
}
realizacja:
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;
}
}
Aby go użyć:
@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());
}
W przeciwnym razie, jeśli chcesz używać zmiennych konfiguracyjnych, mógłbyś może użyć czegoś takiego? source
@Value("#{systemProperties['pop3.port'] ?: 25}")
Dziękuję, jestem świadomy adnotacji @Document i prawdopodobnie na tym skorzystam. Zasadniczo chciałem uzupe łnić konfigurację z rzeczywistej klasy. Problem JIRA, z którym się łączysz, mówi o strategii nazewnictwa i nadal sugeruje użycie adnotacji do niestandardowych nazw. – Danish
Atrybut 'collection' obsługuje Spel, dzięki czemu można wywoływać dowolne metody na innych komponentach Spring, aby obliczyć nazwę kolekcji, np. Za pomocą' # {# bean.someMethod (T (your.fully.qualified.Type))} 'if you zarejestrowali komponent jako "bean" dostarczający metodę 'someMethod (klasa >)'. –