繁体   English   中英

Spring-data-mongo:如何创建共享通用存储库方法?

[英]Spring-data-mongo : How to create shared generic repository methods?

我正在尝试为项目中的MongoRepositories子集提供一些自定义泛型方法。

我有以下基础存储库:

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

    RangeResponse<T> findAllInRange(RangeRequest rangeRequest);
}

实施如下:

public abstract class BaseRepositoryImpl<T, ID extends Serializable> extends SimpleMongoRepository<T, ID>
        implements BaseRepository<T, ID> {

    private MongoOperations mongoOperations;
    private MongoEntityInformation<T, ID> entityInformation;

    public BaseRepositoryImpl(final MongoEntityInformation<T, ID> entityInformation, final MongoOperations mongoOperations) {
        super(entityInformation, mongoOperations);

        this.entityInformation = entityInformation;
        this.mongoOperations = mongoOperations;
    }

    private String getCollectionName() {

        return entityInformation.getCollectionName();
    }

    private Class<T> getJavaType() {

        return entityInformation.getJavaType();
    }

    @Override
    public RangeResponse<T> findAllInRange(final RangeRequest rangeRequest) {

        long count = count();

        final Query query = new Query()
                .skip(rangeRequest.getOffset())
                .limit(rangeRequest.getLimit() - rangeRequest.getOffset() + 1)
                .with(rangeRequest.getSort());

        List<T> clients = this.mongoOperations.find(query, getJavaType(), getCollectionName());

        return new RangeResponse<>(clients, rangeRequest, count);
    }
}

但是,如果我尝试将其添加到现有的仓库:

@Repository
public interface MyRepository extends MongoRepository<MyEntity, String>, BaseRepository<MyEntity, String> {

}

我得到以下异常:

[...]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property findAllInRange found for type MyEntity !
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE]
[...]

我可以使用'repositoryBaseClass'来解决这个问题:

@Configuration
@EnableMongoAuditing
@EnableMongoRepositories(
    basePackages = {
            "com.example.repository",
    }
    repositoryBaseClass = BaseRepositoryImpl.class
)
public class MongoConfig {

}

但我不希望我的所有存储库继承此自定义方法。

有任何想法吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM