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

questionAnswers(2)

yourAnswerToTheQuestion