Java 无法在spring启动应用程序中自动连接接口

Java 无法在spring启动应用程序中自动连接接口,java,spring,spring-boot,Java,Spring,Spring Boot,我正在使用SpringBoot开发RESTAPI。下面是我的包结构 在尝试启动应用程序时遇到以下异常 *************************** APPLICATION FAILED TO START *************************** Description: Field articleRepository in com.abc.service.ArticleService required a bean of type 'com.abc.dao.Artic

我正在使用SpringBoot开发RESTAPI。下面是我的包结构 在尝试启动应用程序时遇到以下异常

***************************
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)
在abcapapplication.java中,由于它不在根包中,我有以下注释

@SpringBootApplication
@ComponentScan(basePackages="com.abc.*")
我尝试了几种方法-

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

@Repository
public interface ArticleRepository {

}

理想情况下,您应该有一个实现接口存储库的类。用@Repository注释该类,spring将负责连接

理想情况下,您应该有一个实现接口存储库的类。用@Repository注释该类,spring将负责连接

您没有用于ArticleRepository的bean。如果要使用SpringDataJPA,则必须扩展一种类型的存储库:


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

您没有任何用于ArticleRepository的bean。如果要使用SpringDataJPA,则必须扩展一种类型的存储库:


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

MyBatis提供了两个示例,用于使用spring boot访问数据库。@Component或@Mapper

示例链接:

建议:
完整显示您的文章库代码。

MyBatis提供两个示例,用于使用spring boot访问数据库。@Component或@Mapper

示例链接:

建议:
完整显示您的文章存储库代码。

如果您正在使用任何RDBMS,并且
文章存储库
负责与您的数据库交互,那么您需要在
文章存储库
中扩展
crudepository
JpaRepository
,这样,只有Spring才能创建
ArticleRepository
的bean,并且您可以自动连接存储库

如果您没有扩展任何
crudepository
JpaRepository
,那么在创建bean时,
articlepository
只是普通java接口,不能实例化普通接口

至于你的问题:

Instead of interface(ArticleRepository.java) I made it a class, it is working

这是因为当您将其声明为类时,Spring会实例化一个具体的类,因此实际的对象将在bean创建时创建,并且一切都将正常工作。

如果您使用的是任何RDBMS,并且
ArticleRepository
repository负责与您的数据库交互,然后您需要在您的
文章存储库中扩展
crudepository
JpaRepository
,然后只有Spring才能创建
文章存储库的bean,并且您将能够自动连接存储库

如果您没有扩展任何
crudepository
JpaRepository
,那么在创建bean时,
articlepository
只是普通java接口,不能实例化普通接口

至于你的问题:

Instead of interface(ArticleRepository.java) I made it a class, it is working

这是因为当您将它声明为一个类时,Spring会实例化一个具体的类,所以实际的对象将在bean创建时创建,并且一切都将按它应该的方式工作。

接口不需要任何注释(无论是@repository还是@Service)

如果是DAO文件,则向实现相应接口的类添加@Repository注释

@Repository
public interface ArticleRepository {

}

并且,如果它是服务,那么将@service注释添加到实现相应接口的类中。

接口不需要任何注释(无论是@repository还是@service)

@Repository
public interface ArticleRepository {

}
如果是DAO文件,则向实现相应接口的类添加@Repository注释

@Repository
public interface ArticleRepository {

}

如果它是服务,那么将@service注释添加到实现相应接口的类中。

我也遇到了同样的问题。我错过的是spring boot starter jpa依赖性。当我在pom.xml文件中添加这个依赖项时,它起作用了。

我也遇到了同样的问题。我错过的是spring boot starter jpa依赖性。当我在pom.xml文件中添加此依赖项时,它起作用了。

您是否正在尝试使用Spring数据自动生成存储库?如果是这样,您还没有显示任何配置。如果没有,您有它的任何实现吗?在主目录中添加
@EntityScan(basePackages={“com.abc.*})
class@chrylis对我需要为它添加一个实现。尝试添加
extensed Repository
,其中
ID
文章的标识符类型
。将
abcapapplication
放入
com.abc
包中,然后重新启动。否则它将只检测并自动配置
com.abc.web
和子包中的内容。但是,您的存储库等不在该包中。这样,您还可以删除
@ComponentScan
。另外,您的
文章存储库
假设您要使用Spring数据,则需要扩展
CRUDepository
(或
存储库
),至少要检测到。您是否尝试使用Spring数据自动生成存储库?如果是这样,您还没有显示任何配置。如果没有,您有它的任何实现吗?在主目录中添加
@EntityScan(basePackages={“com.abc.*})
class@chrylis对我需要为它添加一个实现。尝试添加
extensed Repository
,其中
ID
文章的标识符类型
。将
abcapapplication
放入
com.abc
包中,然后重新启动。否则它只会走弯路
@Repository
public interface ArticleRepository {

}