java - conectar - Cómo configurar el nombre de la colección MongoDb para una clase en Spring Data
spring data mongodb (3)
El único comentario que puedo agregar es que debes agregar el prefijo @ al nombre del bean:
collection = "#{@beanName.method()}"
Para la fábrica de frijoles inyectar el frijol:
@Document(collection = "#{@configRepositoryCustom.getCollectionName()}")
public class Config {
}
Luché para resolverlo ...
EJEMPLO COMPLETO:
@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);
}
uso en 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;
}
Tengo una colección llamada Products
en mi base de datos MongoDB, que está representada por la interfaz IProductPrice
en mi código Java. La siguiente declaración del repositorio hace que Spring Date busque la colección db.collection: Intelliprice.iProductPrice
.
Quiero que lo configure para ver en db.collection: Intelliprice.Products
usando una configuración externa en lugar de poner una @Collection(..)
en IProductPrice
. es posible? ¿Cómo puedo hacer esto?
public interface ProductsRepository extends
MongoRepository<IProductPrice, String> {
}
La única forma en que actualmente puede lograr esto es anotando su clase de dominio con @Document
usando la propiedad de collection
para definir el nombre de las instancias de colección de esta clase en la que se guardará.
Sin embargo, hay un problema de JIRA abierto que sugiere agregar una estrategia de nomenclatura conectable para configurar las formas en que se manejan los nombres de clase, colección y propiedad de una manera más global. Siéntase libre de comentar su caso de uso y votar.
Usando la respuesta de Oliver Gierke arriba, trabajando en un proyecto donde necesito crear múltiples colecciones para una entidad, quise usar los repositorios de Spring y tuve que especificar la entidad a usar antes de usar el repositorio.
Logré modificar el nombre de la colección de repositorios bajo demanda usando este sistema, usando SPeL. Sin embargo, solo puedes trabajar en 1 colección a la vez.
Objeto de dominio
@Document(collection = "#{personRepository.getCollectionName()}")
public class Person{}
Repositorio predeterminado de Spring:
public interface PersonRepository
extends MongoRepository<Person, String>, PersonRepositoryCustom{
}
Interfaz de repositorio personalizado:
public interface PersonRepositoryCustom {
String getCollectionName();
void setCollectionName(String collectionName);
}
implementació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 necesita usar variables de configuración, ¿podría usar algo como esto? source
@Value("#{systemProperties[''pop3.port''] ?: 25}")