usando la respuesta de Oliver Gierke anterior, trabajando en un proyecto en el que necesito crear colecciones múltiples para una entidad, quería usar los repositorios de primavera y necesitaba especificar la entidad a usar antes de usar el repositorio.
Me las arreglé para modificar el nombre de la colección de repositorio bajo demanda usando este sistema, usando SPeL. Sin embargo, solo puedes trabajar en 1 colección a la vez.
objeto Dominio
@Document(collection = "#{personRepository.getCollectionName()}")
public class Person{}
defecto primavera Repositorio:
public interface PersonRepository
extends MongoRepository<Person, String>, PersonRepositoryCustom{
}
interfaz personalizada Repositorio:
public interface PersonRepositoryCustom {
String getCollectionName();
void setCollectionName(String collectionName);
}
aplicación:
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;
}
}
Para usarlo:
@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());
}
De lo contrario, si es necesario utilizar variables de configuración, tal vez podría usar algo como esto? source
@Value("#{systemProperties['pop3.port'] ?: 25}")
Gracias, soy consciente de la anotación @Document y probablemente termine usando eso. Básicamente quería externalizar la configuración de la clase real. El problema de JIRA con el que está vinculado está hablando de una estrategia de nomenclatura y aún sugiere usar la anotación para nombres personalizados. – Danish
El atributo 'collection' admite SpEL para que pueda invocar métodos arbitrarios en otros beans Spring para calcular el nombre de la colección, por ejemplo, usando' # {# bean.someMethod (T (su.totalmente calificado.Tipo))} 'si ha registrado un componente como 'bean' que proporciona un método' someMethod (clase > tipo) '. –