我问这个问题有可能被标记为重复,但我真的不认为是,所以就这样吧
我在运行基本的Spring Boot应用程序时遇到问题。我得到的错误是:
com.example.demo.service.EventService中构造函数的参数0需要一个类型为"com.example.demo.dao.EventRepository"的bean,但找不到该bean。
现在这似乎是一个非常常见的错误(以及SO上的问题(,应该让开发人员检查以下问题:
- 大多数情况下,项目结构是错误的(或者说"自定义"(,并且由于层次结构的原因,bean没有被扫描[问题:这个、这个、这个,可能还有更多]。解决方案应该是将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。现在一切都很好。