存储库上的奇怪的SpringBoot@Autowired错误不是由于错误的项目结构或缺少注释



我问这个问题有可能被标记为重复,但我真的不认为是,所以就这样吧

我在运行基本的Spring Boot应用程序时遇到问题。我得到的错误是:

com.example.demo.service.EventService中构造函数的参数0需要一个类型为"com.example.demo.dao.EventRepository"的bean,但找不到该bean。

现在这似乎是一个非常常见的错误(以及SO上的问题(,应该让开发人员检查以下问题:

  1. 大多数情况下,项目结构是错误的(或者说"自定义"(,并且由于层次结构的原因,bean没有被扫描[问题:这个、这个、这个,可能还有更多]。解决方案应该是将SpringBootApplication放在顶部包中,并将所有组件放在其子包中,这样它就可以正确地扫描所有内容,或者自定义需要扫描的包
  2. 没有定义bean,即缺少类型为@Service、@Repository等的注释,因此没有创建bean
  3. 另一个原因可能是使用了两种不同的定义bean的方法(如本文所述(。我使用的是纯粹的注释样式定义,所以我认为我在这里应该很好

此外,这个问题的答案提到从application.properties文件中排除JPA存储库的自动配置,但我没有这个配置集。

还有几个问题/答案提到了依赖关系和解决这个问题的pom.xml文件的问题,但我的pom.xml是一个从Spring Initializr创建的非常基本的文件,所以我再次认为这不是解决方案。

错误信息还显示:

考虑在配置中定义一个类型为"com.example.demo.dao.EventRepository"的bean。

"丢失的bean"是这个存储库:

package com.example.demo.dao;
import com.example.demo.entity.Event;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EventRepository extends JpaRepository<Event, Integer> {
}

您可以看到它有@Repository注释(尽管我以前创建过没有此注释的存储库,它运行良好,所以我认为这不是必需的,但我现在添加了它,以防出现问题(,它扩展了JpaRepository,因此它应该是一个有效的存储库并且位于com.example.demo.dao包中。

自动布线的类这是一个服务:

package com.example.demo.service;
import com.example.demo.dao.EventRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EventService {
EventRepository eventRepository;
@Autowired
public EventService(EventRepository eventRepository) {
this.eventRepository = eventRepository;
}
}

我还将提供主应用程序,以便您可以看到它的包是com.example.demo,它是服务和存储库的父包:

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

我还尝试过重建该项目和IntelliJ臭名昭著的"关闭和重新开放",因为根据我的经验,它有时表现得很愚蠢,这会解决问题,但这次不行。

顺便说一句,我以前已经成功地创建了这类项目,所以我真的不确定现在的问题是什么。

我是不是遗漏了一些显而易见的东西?我还能查什么?

编辑:

这也是实体类(由IDE工具生成(:

package com.example.demo.entity;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Objects;
@Entity
public class Event {
private int id;
private String name;
private Timestamp dateFrom;
private Timestamp dateTo;
// getters & setters abstracted
}

事实证明这毕竟是pom.xml的问题。

我后来添加了JPA依赖项,但不小心添加了错误的依赖项。我的pom.xml

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>

而不是

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

显然,用于从表生成实体的IDE工具缺少javax.persistence,所以它通过lib文件夹手动添加了那个jar。在IntelliJ看来一切都很好,但依赖关系之间有些混乱。

无论如何,我更改了pom.xml中的依赖项,并删除了添加的额外jar。现在一切都很好。

最新更新