Spring Data Mongo Repository :: Método compartido común en todos los problemas de Repo
Caso de uso
Estoy tratando de usarAñadiendo comportamiento personalizado a todos los repositorios. Funcionalidad de Spring Data MongoDB.
La documentación describe, de manera poco útil, cómo conectarse utilizando JPA. De todos modos conseguí la configuración configurada con el equivalente de Mongo.
Quiero agregar un método findByCategoryName (String categoryName) a todas las entidades, ya que todas mis entidades tendrán una categoría. La categoría es un objeto DBRef por lo que hay que utilizar consultas personalizadas.
A continuación se muestra parte relevante de la configuración.
<code><!-- Activate Spring Data MongoDB repository support --> <mongo:repositories base-package="com.domain.*.repo" repository-impl-postfix="CustomImpl" factory-class="com.domain.commonrepo.CommonMongoRepoFactoryBean"/> <bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> <mongo:mapping-converter mapping-context-ref="mappingContext"> <mongo:custom-converters base-package="com.domain.mongo.converter" /> </mongo:mapping-converter> <bean id="entityInformationCreator" class="org.springframework.data.mongodb.repository.support.DefaultEntityInformationCreator"> <constructor-arg name="mappingContext" ref="mappingContext" /> </bean> </code>
. .
El FactoryBean
<code> @NoRepositoryBean public class CommonMongoRepoFactoryBean<T extends MongoRepository<?,?>, ID extends Serializable> extends MongoRepositoryFactoryBean{ @Autowired private static MongoTemplate mongoTemplate; protected MongoRepositoryFactory getRepositoryFactory(Class<T> clazz) { return new CommonMongoRepoFactory(clazz); } private static class CommonMongoRepoFactory extends MongoRepositoryFactory { private Class clazz; public CommonMongoRepoFactory(Class clazz) { super(mongoTemplate); this.clazz = clazz; } public CommonMongoRepoImpl getTargetRepository() { return new CommonMongoRepoImpl(clazz); } public Class<?> getRepositoryClass() { return CommonMongoRepoImpl.class; } } </code>
Sé que es un poco hack, pero sin documentación es un dolor. Si alguien sabe mejor POR FAVOR, dame un enlace de github :-)
Interfaz de repo común
<code> @NoRepositoryBean public interface CommonMongoRepo<T, ID extends Serializable> extends MongoRepository<T,ID> { public List<T> findByCategoryName(String categoryName); </code>
Implementación
<code> @NoRepositoryBean public class CommonMongoRepoImpl<T, ID extends Serializable> extends SimpleMongoRepository<T, ID> implements CommonMongoRepo<T, ID> { private Class<T> type; @Autowired private static MongoTemplate mongoOperations; @Autowired private static EntityInformationCreator entityInformationCreator; @Autowired private CategoryRepo categoryRepo; public CommonMongoRepoImpl(Class<T> type) { super((MongoEntityInformation<T, ID>) entityInformationCreator.getEntityInformation(type), mongoOperations); } @Override public List<T> findByCategoryName(String categoryName) { Category category = categoryRepo.findByName(categoryName); return mongoOperations.find(query(where("categories.$id").is(category.getId())), type); } </code>
PROBLEMA
Ahora cuando intento usar el método común obtengo una excepción
No se ha encontrado ninguna categoría de propiedad en "Entidad". Supongo que cuando Mongo Repo está intentando implementar el método automáticamente. Esto es a pesar de que yo declare el bean como @NoRepositoryBean
¡¡¡POR FAVOR AYUDA!!! No quiero agregar el mismo método personalizado a todas las entidades