我正在使用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
存储库负责与您的数据库交互,那么您需要在CrudRepository
中扩展JpaRepository
或ArticleRepository
,然后只有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将负责布线。
MyBatis为您提供了两个样本,可以通过spring boot来访问您的数据库。@ Component或@Mapper。
示例链接:mybatis-spring-boot-sample-xml
建议:完全显示您的ArticleRepository代码。