【问题标题】:How to get the Spring Data JPA Repository Factory?如何获取 Spring Data JPA 存储库工厂?
【发布时间】:2016-02-03 20:18:48
【问题描述】:

由于我没有得到my previous question 的答复,我试图调整Spring documentation 中给出的示例以自定义存储库。有一个方法getRepository(Class repositoryInterface) 看起来像它是映射我的存储库覆盖的正确位置:

public class MyRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable>
        extends JpaRepositoryFactoryBean<R, T, I> {

    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {

        return new MyRepositoryFactory<>(entityManager);
    }

    private static class MyRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory {

        private EntityManager entityManager;

        @Resource
        private Map<Class<?>, Class<?>> overrideRepositories;

        public MyRepositoryFactory(EntityManager entityManager) {
            super(entityManager);
            this.entityManager = entityManager;

            //Test
            overrideRepositories = new HashMap<>();
            overrideRepositories.put(CustomerRepository.class, Customer2Repository.class);
        }

        protected Object getTargetRepository(RepositoryMetadata metadata) {

            return super.getTargetRepository(metadata);
            // return new MyRepositoryImpl<T, I>((Class<T>)
            // metadata.getDomainClass(), entityManager);
        }

        protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {

            // The RepositoryMetadata can be safely ignored, it is used by the
            // JpaRepositoryFactory
            // to check for QueryDslJpaRepository's which is out of scope.
            return JpaRepository.class;
        }

        @SuppressWarnings("unchecked")
        @Override
        public <E> E getRepository(Class<E> repositoryInterface, Object customImplementation) {
            if (overrideRepositories != null) {
                Class<?> override = overrideRepositories.get(repositoryInterface);
                if (override != null) {
                    repositoryInterface = (Class<E>) override;
                }
            }
            return super.getRepository(repositoryInterface, customImplementation);
        }
    }
}

我是这样配置的:@EnableJpaRepositories(repositoryFactoryBeanClass=MyRepositoryFactoryBean.class)

通常您会自动装配存储库本身,这不起作用,因为有两个具有相同类型和 I don't know how to tell Spring which one to use 的接口。

如果我改为自动装配工厂,我可以在每次需要特定工厂时致电getRepository。但是我如何获得这个工厂呢? Spring Data JPA 是否以某种方式将其公开为 bean?我在谷歌上找不到任何关于此的内容。还是这种方法完全错误?

【问题讨论】:

    标签: java spring spring-data spring-data-jpa


    【解决方案1】:

    您可以使用ApplicationContext 实例来获取您的MyRepositoryFactoryBean bean 类。您所要做的就是实现ApplicationContextAware 接口,以便访问ApplicationContext 实例。

      public class myClass implements ApplicationContextAware{
        
            private static ApplicationContext ac;
            
                @Override
                public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
                    this.ac = applicationContext;
                }
            
            }
    

    现在您可以使用ac.getBean("MyRepositoryFactoryBean") 直接从ApplicationContext 获取工厂。获得该 bean 后,您可以在其上调用 getRepository

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      相关资源
      最近更新 更多