首页 > 解决方案 > 存储库上的奇怪 Spring Boot @Autowired 错误不是由于错误的项目结构或缺少注释

问题描述

我问这个问题有被标记为重复的风险,但老实说我不这么认为,所以就这样吧。

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

com.example.demo.service.EventService 中构造函数的参数 0 需要找不到类型为“com.example.demo.dao.EventRepository”的 bean。

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

  1. 最常见的项目结构是错误的(或者我们说“自定义”),并且由于层次结构而没有扫描 bean [问题:thisthisthisthis可能还有更多]。解决方案应该是将 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
}

标签: spring-bootspring-mvcspring-data-jpa

解决方案


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。现在一切正常。


推荐阅读