spring-boot - 存储库上的奇怪 Spring Boot @Autowired 错误不是由于错误的项目结构或缺少注释
问题描述
我问这个问题有被标记为重复的风险,但老实说我不这么认为,所以就这样吧。
我在运行基本的 Spring Boot 应用程序时遇到问题。我得到的错误是:
com.example.demo.service.EventService 中构造函数的参数 0 需要找不到类型为“com.example.demo.dao.EventRepository”的 bean。
现在这似乎是一个非常常见的错误(以及关于 SO 的问题),应该指出开发人员检查以下问题:
- 最常见的项目结构是错误的(或者我们说“自定义”),并且由于层次结构而没有扫描 bean [问题:this、this、this、this可能还有更多]。解决方案应该是将 SpringBootApplication 放在顶层包中,将所有组件放在其子包中,以便它可以正确扫描所有内容或自定义需要扫描的包。
- 没有定义bean,即缺少@Service、@Repository 等类型的注释,因此没有创建bean。
- 另一个原因可能是使用两种不同的方式来定义 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。现在一切正常。
推荐阅读
- r - 如何从排名数据中对第一个样本进行排名
- java - 将 SSH 节点添加到 Jenkins 时出错 - 无法读取完整块,已达到 EOF
- python - Python 一种分割字符串,如“192.168.0.0/24”和“8.8.8.8”?
- java - 基于 Akka 演员源的滑动窗口未按预期运行
- php - 如何发送数组sqlj json ue4 varest插件
- ios - 键盘显示后快速按钮更改位置
- java - 当 getChatMember 不再起作用时,是否有另一种方法来获取用户对象?
- kubernetes - 为什么 Kubernetes 控制平面(master)必须是 linux?
- delphi - 尝试使用 TIdHTTP 下载文件时出现“扩展内存流时内存不足”错误
- python - 如何从ajax请求中获取JSON数据