Spring Data Mongo Repository :: Método compartilhado comum em toda a questão do Repo
Caso de uso
Estou tentando usarAdicionando comportamento personalizado a todos os repositórios funcionalidade do Spring Data MongoDB.
A documentação descreve de maneira pouco útil como se conectar usando o JPA. De qualquer forma, tenho a configuração de configuração com o equivalente do Mongo.
Eu quero adicionar um método findByCategoryName (String categoryName) para todas as entidades, como todas as minhas entidades terão uma categoria. A categoria é um objeto DBRef, portanto, é necessário usar uma consulta personalizada.
Abaixo está parte relevante da configuração
<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>
. .
O 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>
Eu sei que é um pouco um hack, mas sem documentação é uma dor. Se alguém souber melhor POR FAVOR, me dê um link github :-)
Interface comum do Repo
<code> @NoRepositoryBean public interface CommonMongoRepo<T, ID extends Serializable> extends MongoRepository<T,ID> { public List<T> findByCategoryName(String categoryName); </code>
Implementação
<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
Agora, quando estou tentando usar o método comum, recebo uma exceção
Nenhuma categoria de propriedade encontrada em "Entidade". O que é que eu acho quando o mongo repo está tentando implementar automaticamente o método. Isso é muito legal para mim declarar o bean como @NoRepositoryBean
POR FAVOR AJUDE!!! Não quer adicionar o mesmo método personalizado a todas as entidades