扩展SimpleJpaRepository

时间:2017-07-30 19:30:15

标签: java spring spring-boot

当我想扩展SimpleJpaRepository时,我正在使用Spring Boot:

public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID>{}

和这个实现:

public class BaseRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements BaseRepository<T, ID>
{
    private final EntityManager entityManager;

    public BaseRepositoryImpl(Class<T> domainClass, EntityManager entityManager)
    {
        super(domainClass, entityManager);
        this.entityManager = entityManager;
    }
}

我收到以下错误:

Could not autowire. No beans of 'Class<T>' type found.

我该如何解决?

2 个答案:

答案 0 :(得分:1)

当尝试通过扩展JpaRepository来实现SimpleJpaRepository时,spring知道您正在这样做很重要。默认情况下,即使扩展它,spring也会尝试创建SimpleJpaRepository。因此,SimpleJpaRepository的新实现将不会被填充,创建甚至无法远程使用。因此,扩展您的新自定义存储库的所有存储库也将也不会创建

要解决此问题,应添加一些存储库配置。更具体地说,您需要在repositoryBaseClass批注中提供@EnableJpaRepositories;例如

@Configuration
@EnableJpaRepositories(
    repositoryBaseClass = RepositoryImpl.class
)

通常,您已经有了一些配置类来提供DataSource-bean,EntityManager-bean和/或JpaTransactionManager-bean。作为一般的最佳做法,我建议将其放在那儿。

有时候,当您这样做时,spring会有些混乱,但仍然无法找到新定义的repositoryBaseClass。在这种情况下,请稍微帮助spring仓库自动接线器,并提供基本软件包,例如

@Configuration
@EnableJpaRepositories(
    repositoryBaseClass = RepositoryImpl.class,
    basePackages = {
        "be.your.company.your.path.to.your.repositories"
    }
)

答案 1 :(得分:0)

创建一个扩展JpaRepository的接口

例如 -

public interface Repository extends JpaRepository<Entity,Integer>,RepositoryCustom // this is our custom repository{


}

存储库自定义是一个接口

public interface RepositoryCustom {


    List<Entity> getAll(); // define the method signature here


}

实施自定义界面

@Transactional
public class RepositoryImpl implements  RepositoryCustom{

    @PersistenceContext // this will inject em in your class
    private EntityManager entityManager;

    write the method body and return

}
  

请记住存储库命名约定。如果是接口名称   是存储库。然后自定义界面shuld命名为   存储库和实现为存储库