当我想扩展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.
我该如何解决?
答案 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命名为 存储库和实现为存储库