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