我正在使用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 {
}
答案 0 :(得分:3)
您没有ArticleRepository的任何bean。如果您将使用Spring Data Jpa,则必须扩展一种存储库:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories。
如果您将使用自己的存储库,则必须实现它。
答案 1 :(得分:2)
如果您正在使用任何RDBMS,并且ArticleRepository
存储库负责与您的数据库交互,那么您需要在CrudRepository
中扩展JpaRepository
或ArticleRepository
,那么只有Spring才能创建ArticleRepository
的bean,你将能够自动装配你的存储库。
如果您没有扩展CrudRepository
或JpaRepository
中的任何一个,那么在创建bean时,ArticleRepository
只是普通的java接口,并且无法实例化普通接口。 / p>
至于你的问题:
Instead of interface(ArticleRepository.java) I made it a class, it is working
因为当你将它声明为一个类时,Spring会实例化一个具体的类,所以实际的对象将在bean创建时创建,一切都将按原样运行。
答案 2 :(得分:1)
理想情况下,您应该有一个实现接口ArticleRepository的类。使用@Repository注释该类,spring将负责布线。
答案 3 :(得分:1)
我也遇到了同样的问题。我错过的是 spring-boot-starter-jpa 依赖项。当我在 pom.xml 文件中添加这个依赖项时它起作用了。
答案 4 :(得分:0)
MyBatis为您提供了两个样本,可以通过spring boot来访问您的数据库。@ Component或@Mapper。
示例链接: mybatis-spring-boot-sample-xml
建议: 完全显示 ArticleRepository 代码。
答案 5 :(得分:0)
界面不需要任何注释(@repository都不需要@Service)。
如果是DAO文件,则在实现相应接口的类中添加@Repository批注。
并且,如果它是一项服务,则将@Service批注添加到实现相应接口的类中。