2012-07-16 83 views
1

我跟着创建和自定义库的参考指南,并与下面上来:如何在Spring-Data-JPA的自定义实现存储库中使用我的基本存储库方法?

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

    @Override 
    protected RepositoryFactorySupport createRepositoryFactory(
     EntityManager entityManager) { 

     return new MyBasicRepositoryFactory<T, I>(entityManager); 
    } 

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

     private EntityManager entityManager; 

     public AlisDaoFactory(EntityManager entityManager) { 
     super(entityManager); 

      this.entityManager = entityManager; 
     } 

     @Override 
     protected Object getTargetRepository(RepositoryMetadata metadata) { 

      return new AlisDaoImpl<T, I>((Class<T>) metadata.getDomainType(), 
       entityManager); 
     } 

     @Override 
     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 MyBasicRepository.class; 
     } 
} 





@NoRepositoryBean 
public interface MyBasicRepository<T extends MyEntity, KEY extends Serializable> extends CrudRepository<T, KEY> { 

    void customBaseFoo(T entity); 

} 

public interface ChildCustomRepository{ 

    void customChildFoo(); 
} 

public interface ChildRepository extends MyBasicRepository<Child, Integer>, ChildCustomRepository { 

    void findByName(String name); 
} 

现在的customChildFoo()实施,我想打电话给ChildRepository.findByName甚或MyBasicRepository.customBaseFoo()

这些当然是不可访问的,因为ChildRepositoryImpl执行ChildCustomRepository而不是ChildRepository,否则我将不得不为基本的CRUD和自定义接口编写实现。

所以我试图注入ChildRepository到默认地将Impl这样:

public class ChildRepositoryImpl implements ChildCustomRepository{ 
    @Resource 
    private ChildRepository base; 

    @Override 
    public void customChildFoo(){ 
     Child child = base.findByName(); 
     // do some logic with found child here 
     base.customBaseFoo(child);    
    } 

但由于它失败: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'childDao': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149) at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:109) at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1442) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:848) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:790) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:438) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:549) at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303) ... 65 more Caused by: java.lang.NullPointerException at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:125) at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:41) at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142) ... 78 more

那么,如何才能实现这一目标?

回答

1

我知道的一个解决方案是在ChildRepositoryImpl类中实现接口ApplicationContextAware并阅读bean,如applicationContext.getBean(<bean name>)。 我不想实现这个,但这是我现在知道的唯一选项。

0

将父库存入自定义实现是可以的,它为我工作。但我没有使用任何RepositoryFactoryBean来定制我的回购。目前使用Spring Data JPA 1.3.0,也许你应该试试最新版本。

相关问题