使用事例
Spring Data MongoDB のすべてのリポジトリにカスタム動作を追加する機能を使用しようとしています。
ドキュメントには、JPA を使用して接続する方法が説明されていますが、役に立ちません。とにかく、Mongo に相当する設定をセットアップしました。
すべてのエンティティに Category があるため、すべてのエンティティに findByCategoryName(String categoryName) メソッドを追加したいと考えています。カテゴリは DBRef オブジェクトであるため、カスタム クエリを使用する必要があります。
以下は構成の関連部分です
<!-- 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>
. .
FactoryBean
@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;
}
}
ちょっとしたハックであることは知っていますが、ドキュメントがないと面倒です。誰かがもっとよく知っているなら、私にgithubリンクを教えてください:-)
共通リポジトリ インターフェイス
@NoRepositoryBean
public interface CommonMongoRepo<T, ID extends Serializable> extends MongoRepository<T,ID> {
public List<T> findByCategoryName(String categoryName);
実装
@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);
}
問題
一般的な方法を使用しようとすると、例外が発生します
「エンティティ」にプロパティ カテゴリが見つかりません。これは、mongo repo がメソッドを自動実装しようとしているときだと思います。これは、Bean を @NoRepositoryBean として宣言しているにもかかわらずです。
助けてください!!!すべてのエンティティに同じカスタム メソッドを追加したくない