Spring Data Mongo Repository:: Common shared method across all Repo issue

后端 未结 2 433
轮回少年
轮回少年 2020-12-16 06:34

Use Case

I am trying to use Adding custom behaviour to all repositories functionality of Spring Data MongoDB.

The documentation unh

相关标签:
2条回答
  • 2020-12-16 07:00

    Here is the best solution!

    Step One:
    Add a custom method to interface!
    增加一个自定义的方法

    #custom interface

    /**
     * Basic Repository for common custom methods
     * @author liangping
     */
    
    import java.io.Serializable;
    
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.repository.MongoRepository;
    import org.springframework.data.repository.NoRepositoryBean;
    import org.springframework.data.repository.PagingAndSortingRepository;
    
    @NoRepositoryBean
    public interface WootideRepositoryCustom <T, ID extends Serializable>
          extends PagingAndSortingRepository<T, ID>, MongoRepository<T, ID> {
    
          public Page<T> search(Query query, Pageable pageable);
    }
    

    Implementation

    Step Two:
    Add implement for your custom method!
    实现你的自定义方法

    /**
     * implement for wootide basic repository
     * @author liangping
     */
    
    import java.io.Serializable;
    
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageImpl;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.mongodb.core.MongoOperations;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
    import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
    
    public class WootideRepositoryImpl<T, ID extends Serializable> extends
            SimpleMongoRepository<T, ID> implements WootideRepositoryCustom<T, ID> {
    
        public WootideRepositoryImpl(MongoEntityInformation<T, ID> metadata,
                MongoOperations mongoOperations) {
            super(metadata, mongoOperations);
        }
    
        @Override
        public Page<T> search(Query query, Pageable pageable) {
            long total = this.getMongoOperations().count(query, this.getEntityInformation().getJavaType() );
            return new PageImpl<T>(this.getMongoOperations().find(query.with(pageable), this.getEntityInformation().getJavaType()), pageable, total);
        }
    
    }
    

    Create a new factory for custom repository

    /**
     * Repository Factory for all Subrepository
     * @author liangping
     */
    
    import java.io.Serializable;
    
    import org.springframework.data.mongodb.core.MongoOperations;
    import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity;
    import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
    import org.springframework.data.mongodb.repository.MongoRepository;
    import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
    import org.springframework.data.mongodb.repository.support.MappingMongoEntityInformation;
    import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory;
    import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean;
    import org.springframework.data.repository.core.RepositoryMetadata;
    import org.springframework.data.repository.core.support.RepositoryFactorySupport;
    import org.springframework.data.util.ClassTypeInformation;
    import org.springframework.data.util.TypeInformation;
    
    public class WootideRepositoryFactoryBean<R extends MongoRepository<T, I>, T, I extends Serializable>
            extends MongoRepositoryFactoryBean<R, T, I> {
    
        @Override
        protected RepositoryFactorySupport getFactoryInstance(
                MongoOperations operations) {
            return new WootideMongoRepositoryFactory<T,I>( operations );
        }
    
        private static class WootideMongoRepositoryFactory<T, ID extends Serializable>
                extends MongoRepositoryFactory {
    
            private MongoOperations mongo;
            public WootideMongoRepositoryFactory(MongoOperations mongoOperations) {
                super(mongoOperations);
                this.mongo = mongoOperations;
            }
    
            @SuppressWarnings("unchecked")
            protected Object getTargetRepository(RepositoryMetadata metadata) {
    
                TypeInformation<T> information =  ClassTypeInformation.from((Class<T>)metadata.getDomainType());
                MongoPersistentEntity<T> pe = new BasicMongoPersistentEntity<T>(information);
                MongoEntityInformation<T,ID> mongometa = new MappingMongoEntityInformation<T, ID>(pe);
    
                return new WootideRepositoryImpl<T, ID>( mongometa,  mongo);
            }
    
            protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
                return WootideRepositoryCustom.class;
            }
        }
    }
    

    Make it works

    <mongo:repositories base-package="com.***.mongodb" 
    factory-class="com.***.mongodb.custom.WootideRepositoryFactoryBean"/>
    

    Good Luck! 祝你好运!

    0 讨论(0)
  • 2020-12-16 07:00

    Somewhat delayed but here is sample code that does this for a Spring web app project. The salient points are:

    1. Interface used in Controller
    2. Implementation done in a separate class that inherits from a base
    3. The base implementation provides common methods that any other Controller can use with just a quick inheritance
    0 讨论(0)
提交回复
热议问题