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

Respuestas a la pregunta(2)

Su respuesta a la pregunta