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