我犯了一个非常愚蠢的错误,但无法弄清楚该如何解决。
我有一个使用配置文件的简单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
上添加注释吗?
谢谢。
答案 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没有正确创建。
可能的解决方案:
@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默认实现时,您只能为“测试”配置文件加载此配置。
答案 3 :(得分:-1)
我认为对于Spring Data MongoDB,只需将@EnableMongoRepositories
批注添加到@Configuration
类中即可。只需确保它与您的主应用程序位于同一软件包下,或配置组件扫描以将其提取即可。