SpringBoot:不满足的依赖项NoSuchBeanDefinitionException,预计至少有1个可以作为自动装配候选者的bean

时间:2019-05-09 23:57:11

标签: java spring-boot dependency-injection spring-mongodb

我犯了一个非常愚蠢的错误,但无法弄清楚该如何解决。

我有一个使用配置文件的简单SpringBoot应用程序,该应用程序连接到MongoDb。

我的 pom.xml 依赖项:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
</dependencies>

我的 StudentController.java

@RestController
@RequestMapping("/students")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @RequestMapping(method = RequestMethod.GET)
    public Collection<Student> getAllStudents(){
        return studentService.getAllStudents();
    }
}

我的 StudentService.java

@Service
public class StudentService {

    @Autowired
    private StudentDao studentDao;

    public Collection<Student> getAllStudents(){
        return this.studentDao.getAllStudents();
    }
}

我的 StudentDao.java 界面:

public interface StudentDao {
    Collection<Student> getAllStudents();
}

我的 MongoStudentDaoImpl.java

@Repository
@Profile("test")
public class MongoStudentDaoImpl implements StudentDao {

    @Autowired
    private MongoStudentRepo repo;

    @Override
    public Collection<Student> getAllStudents() {
        return repo.findAll();
    }
}

我的 MongoStudentRepo.java

@Profile("test")
public interface MongoStudentRepo extends MongoRepository<Student, String> {
}

当我尝试使用“测试”配置文件启动应用程序时,这是我看到的错误:

  

上下文初始化期间遇到异常-取消   刷新尝试:   org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名称为'studentController'的bean时出错:不满意   通过字段“ studentService”表示的依赖关系;嵌套异常   是org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名称为'studentService'的bean时出错:不满意的依赖关系   通过字段“ studentDao”表示;嵌套异常为   org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名称为“ mongoStudentDaoImpl”的bean时出错:不满意   通过字段“ repo”表示的依赖关系;嵌套异常为   org.springframework.beans.factory.NoSuchBeanDefinitionException:否   可用类型为“ MongoStudentRepo”的合格Bean:   期望至少有1个符合自动装配候选条件的bean。   依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(required = true)}

我在这里想念什么?我需要在MongoStudentRepo.java上添加注释吗?

谢谢。

4 个答案:

答案 0 :(得分:1)

您的接口类不需要注释,因为Spring Data存储库接口由Spring Data专门处理。

最可能的情况是您的存储库类没有被Spring Data标识(您未指定Spring Boot版本或程序包名称),在这种情况下,您可能需要在{{ 1}}类(您的Spring Boot启动器类也是其中之一)。

答案 1 :(得分:0)

抱歉,我错过了添加到Main.java类中以使另一个配置文件正常工作的排除条件。 @Chrylis,感谢您的指导。

问题 Main.java 文件

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoRepositoriesAutoConfiguration.class})
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

修复了 Main.java 文件

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoRepositoriesAutoConfiguration.class})
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

答案 2 :(得分:0)

stacktrace显示spring无法自动连接 MongoStudentDaoImpl.java 类中的其中一个bean MongoStudentRepo。从stacktrace中:

 Unsatisfied dependency expressed through field 'repo'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'MongoStudentRepo' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: 

Spring抛出此异常意味着MongoStudentRepo.class的bean没有正确创建。

可能的解决方案:

  • 问题可能是因为spring没有使用spring的默认实现为接口创建bean,这可能是因为没有使用注释@EnableJpaRepositories来启用默认存储库bean的扫描和创建。有关更多信息,请阅读here

但是,如果您使用的是基于xml的配置, 对于基于xml的配置,请使用:

<repositories base-package="com.acme.repository" />

<repositories base-package="com.acme.repository" repository-impl-postfix="MyPostfix" />

或使用@Configuration批注:

@Configuration
@EnableJpaRepositories("com.acme.repositories")
class ApplicationConfiguration {

  @Bean
  EntityManagerFactory entityManagerFactory() {
    // …
  }
}

使用spring默认实现时,您只能为“测试”配置文件加载此配置。

最佳读物:https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repositories.custom-implementations

答案 3 :(得分:-1)

我认为对于Spring Data MongoDB,只需将@EnableMongoRepositories批注添加到@Configuration类中即可。只需确保它与您的主应用程序位于同一软件包下,或配置组件扫描以将其提取即可。