如何在春季启动应用程序中自动装配SimpleJpaRepository?

时间:2018-10-07 00:51:08

标签: spring-boot spring-data-jpa

我正在研究一个使用SpringBoot 2.0.5版本(Spring Data JPA)的项目,该项目可以持久化并使用JPA检索记录。我在服务层中自动连接了SimpleJpaRepository。但是在启动我的应用程序时,它失败并显示

"NoSuchBeanDefinitionException"- No qualifying bean of type 
'org.springframework.data.jpa.repository.support.SimpleJpaRepository<?, ?>' 
 available: expected at least 1 bean which qualifies as autowire candidate. 

我的控制器,服务和DAO如下所示

控制器类:

@Controller
public class MyController{
   @Autowired
   private MyService<Person,PersonPK> service;

服务层为

public interface MyService<V,K>{
     methods defined
}
@Service("service")
public class MyServiceImpl<V,K> implements MyService<V,K>{

  @Autowired
  private SimpleJpaRepository<V,K> repository; // This dependency is failing
}

应用程序为:

@SpringBootApplication (exclude = {SecurityAutoConfiguration.class})
@EnableJpaRepositories
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

我的方法不正确吗?这不是自动装配SimpleJpaRepository的正确方法。

我现在不需要扩展SimpleJpaRepository,因为Spring可以提供JPARepository。

谢谢

3 个答案:

答案 0 :(得分:1)

您仍然需要创建一个扩展JpaRepisitory或您选择的spring仓库类型的仓库接口。

引用弹簧数据documentation

  

1.2.1定义存储库接口

     

第一步,定义特定于域类的存储库接口。接口必须扩展   存储库,并键入到域类和ID类型。如果你   想要公开该域类型的CRUD方法,扩展   CrudRepository而不是Repository。

一旦创建了新的存储库类型,您将通过该类型而不是SimpleJpaRepository自动布线。

答案 1 :(得分:0)

您应该创建一个扩展JpaRepisitory的存储库接口。

@Repository
public interface MyRepository extends JpaRepisitory<T, ID> {
    //
}

您应该在服务等级中自动接线。

@Service("service")
public class MyServiceImpl<V,K> implements MyService<V,K>{

  @Autowired
  private MyRepository myRepository;

}

答案 2 :(得分:0)

获得SimpleJpaRepository实现的一种方法是使用Configuration类将实例创建为将在服务内部使用的bean。

@Configuration
public class PersistanceConfiguration {

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public SimpleJpaRepository<YourEntity, Long> getYourEntitySimpleRepository() {
        return new SimpleJpaRepository<>(YourEntity.class, entityManager);
    }
}

并像使用JpaRepository一样将其注入到您的服务中,例如:

@Service
public class YourEntityServiceImpl<YourEntity, Long> implements YourEntityService {

    private JpaRepository<YourEntity, K> repository;
    private SimpleJpaRepository<YourEntity, K> simpleRepository;

    @Autowired
    public YourEntityServiceImpl(YourEntityRepository repository, SimpleJpaRepository<YourEntity, Long> simpleRepository) {
        this.repository = repository;
        this.simpleRepository = simpleRepository;
    }

}