[英]Spring Boot Data JPA cannot autowire repository interface in MockMVC test
[英]Cannot Autowire interface in spring boot app
我正在使用 spring boot 开发 REST API。 以下是我的包结构 当我尝试启动我的应用程序时出现以下异常
***************************
APPLICATION FAILED TO START
***************************
Description:
Field articleRepository in com.abc.service.ArticleService required a bean of type 'com.abc.dao.ArticleRepository' that could not be found.
Action:
Consider defining a bean of type 'com.abc.dao.ArticleRepository' in your configuration.
以下是我的项目结构-
com.abc
com.abc.bean
-Article.java
com.abc.controller
-ArticleController.java
com.abc.dao
-ArticleRepository.java (Interface)
com.abc.service
-ArticleService.java
com.abc.web
-AbcApplication.java (main Springboot class)
在 AbcApplication.java 因为它不在根包中,所以我有以下注释
@SpringBootApplication
@ComponentScan(basePackages="com.abc.*")
我尝试了几种方法 -
如果我将它更改为类而不是接口,我很困惑它是如何工作的。
@Repository
public interface ArticleRepository {
}
您没有任何用于 ArticleRepository 的 bean。 如果您将使用 Spring Data Jpa,则必须扩展一种存储库: https ://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories。
如果您将使用自己的存储库,则必须实现它。
如果您使用任何 RDBMS 并且ArticleRepository
存储库负责与您的数据库交互,那么您需要在ArticleRepository
中扩展CrudRepository
或JpaRepository
,那么只有 Spring 才能创建ArticleRepository
的 bean,并且您将能够自动装配您的存储库。
如果您没有扩展任何CrudRepository
或JpaRepository
,那么在创建 bean 时, ArticleRepository
只是普通的 java 接口,普通接口不能被实例化。
至于你的问题:
Instead of interface(ArticleRepository.java) I made it a class, it is working
这是因为当您将其声明为一个类时,Spring 会实例化一个具体类,因此将在创建 bean 时创建实际对象,并且一切都将按应有的方式运行。
理想情况下,您应该有一个实现接口 ArticleRepository 的类。 用@Repository 注释该类,spring 将负责接线。
我也遇到了同样的问题。 我错过的是spring-boot-starter-jpa依赖项。 当我在 pom.xml 文件中添加此依赖项时,它起作用了。
MyBatis 为您提供了两个使用 spring boot 访问数据库的示例。@Component 或@Mapper。
示例链接: mybatis-spring-boot-sample-xml
建议:完整显示您的ArticleRepository代码。
接口不需要任何注解(@repository 和@Service 都不需要)。
如果它是一个 DAO 文件,请在实现相应接口的类中添加 @Repository 注解。
并且,如果它是一项服务,则将@Service 注释添加到实现相应接口的类中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.