我正在研究一个使用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。
谢谢
答案 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;
}
}