繁体   English   中英

无法在 spring boot 应用程序中自动装配接口

[英]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.*")

我尝试了几种方法 -

  • 我将 AbcApplication.java 移动到根包 com.abc 但没有成功
  • 而不是接口(ArticleRepository.java)我把它变成了一个类,它正在工作
  • 我将它保留为接口,但将注释从 @Repository 更改为 @Service/Component 仍然没有成功。

如果我将它更改为类而不是接口,我很困惑它是如何工作的。

@Repository
public interface ArticleRepository {

}

您没有任何用于 ArticleRepository 的 bean。 如果您将使用 Spring Data Jpa,则必须扩展一种存储库: https ://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories。

如果您将使用自己的存储库,则必须实现它。

如果您使用任何 RDBMS 并且ArticleRepository存储库负责与您的数据库交互,那么您需要在ArticleRepository中扩展CrudRepositoryJpaRepository ,那么只有 Spring 才能创建ArticleRepository的 bean,并且您将能够自动装配您的存储库。

如果您没有扩展任何CrudRepositoryJpaRepository ,那么在创建 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM