Spring Data Mongo Repository :: Wspólna metoda współdzielona we wszystkich kwestiach Repo

Przypadek użycia

Próbuję użyćDodawanie niestandardowych zachowań do wszystkich repozytoriów funkcjonalność Spring Data MongoDB.

Dokumentacja nieprzydatnie opisuje sposób łączenia się za pomocą JPA. W każdym razie dostałem konfigurację z odpowiednikiem Mongo.

Chcę dodać metodę findByCategoryName (String categoryName) do wszystkich elementów, ponieważ wszystkie moje elementy będą miały kategorię. Kategoria to obiekt DBRef, więc musisz użyć niestandardowego zapytania.

Poniżej znajduje się odpowiednia część konfiguracji

<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>

. .

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>

Wiem, że to trochę hack, ale bez dokumentacji to ból. Jeśli ktoś wie lepiej, proszę dać mi link github :-)

Wspólny interfejs Repo

<code>    @NoRepositoryBean
    public interface CommonMongoRepo<T, ID extends Serializable> extends MongoRepository<T,ID> {

public List<T> findByCategoryName(String categoryName);        
</code>

Realizacja

<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>

PROBLEM

Teraz, gdy próbuję użyć wspólnej metody, otrzymuję wyjątek

Nie znaleziono kategorii właściwości w „Podmiot”. Myślę, że gdy mongo repo próbuje zaimplementować tę metodę automatycznie. Jest to pomimo tego, że deklaruję komponent bean jako @NoRepositoryBean

PROSZĘ POMÓŻ!!! Nie chcesz dodawać tej samej metody niestandardowej do wszystkich elementów

questionAnswers(2)

yourAnswerToTheQuestion