Spring Data Mongo Repository :: Gemeinsame Methode für alle Repo-Probleme

Anwendungsfall

Ich versuche es zu benutzenHinzufügen eines benutzerdefinierten Verhaltens zu allen Repositorys Funktionalität von Spring Data MongoDB.

In der Dokumentation wird unhandlich beschrieben, wie Sie eine Verbindung mit JPA herstellen. Sowieso habe das Config Setup mit Mongo gleichgestellt.

Ich möchte allen Entitäten eine findByCategoryName (String categoryName) -Methode hinzufügen, da alle meine Entitäten eine Kategorie haben. Category ist ein DBRef-Objekt, daher muss eine benutzerdefinierte Abfrage verwendet werden.

Unten ist ein relevanter Teil der Konfiguration

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

. .

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

Ich weiß, es ist ein bisschen hacken, aber ohne Dokumentation ist es ein Schmerz. Wenn jemand es besser kennt, gib mir bitte einen Github-Link :-)

Common Repo-Schnittstelle

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

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

Implementierung

<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

Jetzt, wenn ich versuche, die allgemeine Methode zu verwenden, erhalte ich eine Ausnahme

Keine Immobilienkategorie in "Entität" gefunden. Was ich denke, wenn Mongo Repo versucht, die Methode automatisch zu implementieren. Dies ist, obwohl ich die Bean als @NoRepositoryBean deklariert habe

BITTE HILFE !!! Sie möchten nicht allen Entitäten dieselbe benutzerdefinierte Methode hinzufügen

Antworten auf die Frage(2)

Ihre Antwort auf die Frage