没有为依赖项找到类型的限定bean:Spring Boot

时间:2017-12-17 11:04:43

标签: spring-boot

我正在使用一个简单的Spring启动应用程序,我想使用Hibernate连接我的数据库。我无法将我的Repository类注入我的Controller类。请帮忙。但是,当我删除导致代码的问题时,我的应用程序能够扫描每个组件,它工作正常。我已经通过Eclipse创建了我的代码。

我的入门课程

package spring.starter;
@SpringBootApplication
@ComponentScan(basePackages = "spring")
public class Starter {

public static void main(String args[]) {

    ApplicationContext ctx = SpringApplication.run(Starter.class, args);

    }

}

我的控制器类

package spring.controller;
@RestController
@RequestMapping("/app")
public class AdminController {

/*@Autowired
private AdminService service;*/

@Autowired
@Qualifier("adminRepository")
private AdminRepository adminRepository;

@GetMapping("/admin")
public List<Admin> getAllAdmin() {
    return adminRepository.findAll();
}
}

我的存储库类:对于这个类,我尝试删除这两个注释,但也可以工作。

package spring.repository;
@Repository
@Qualifier("adminRepository")
   public interface AdminRepository extends JpaRepository<Admin, Integer>{

 }

异常追踪

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [spring.repository.AdminRepository] found for dependency [spring.repository.AdminRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=adminRepository)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1406) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1057) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
... 19 common frames omitted

2 个答案:

答案 0 :(得分:1)

ComponentScan注释未检测到Spring Data JPA存储库。对于他们,你必须提供注释

@EnableJpaRepositories(basePackages = "spring")

或您更改SpringBootApplication注释如下:

@SpringBootAnnotation(scanBasePackages = "spring")

这将涵盖ComponentScan以及EnableJpaRepositories的自定义程序包配置。 完成其中一项更改后,您还可以从存储库中删除@Repository 。该注释不适用于Spring Data JPA存储库接口,对它们没有影响。

答案 1 :(得分:1)

我发现了问题,我的入门类在spring.starter包中,所有我要做的就是将这个类移到包结构中的一个级别,例如:

package spring;

@SpringBootApplication
@ComponentScan(basePackages = "spring")
public class Starter {

    public static void main(String args[]) {

        ApplicationContext ctx = SpringApplication.run(Starter.class, args);

    }

}

然后它奏效了。但我在这里有一个疑问。那么@ComponentScan的好处是什么?