用例
我正在尝试使用Spring Data MongoDB的向所有存储库添加自定义行为功能。
文档不提供有关如何使用JPA进行连接的有用信息。无论如何,我已经使用Mongo相当的配置完成了设置。
我想为所有实体添加一个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
工厂Bean @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,但仍然出现此问题。
请帮忙!!!不想将相同的自定义方法添加到所有实体中。
JpaRepository
->MongoRepository
等),则应该没问题。对不存在的文档进行抱怨真的没有帮助(尤其是如果它确实存在)。 如果您真的关心,您可以随时提交拉取请求以改进文档。 您介意同时发布具体的存储库接口声明以及存储库基类实现吗? - Oliver Drotbohm