当前位置: 首页 > 知识库问答 >
问题:

SpringJava-构造函数的参数0

羊冠玉
2023-03-14

我正试图编写一个简单的CRUD程序,我得到了这个错误。这个项目是基于我的项目。不知道我为什么不工作。

如果我注释掉构造函数,错误就会消失。我的房子里什么都没有。

有人能帮我一把吗?

Description:

Parameter 0 of constructor in com.example.FitApp3.controller.FoodController required a bean of type 'com.example.FitApp3.repository.FoodRepository' that could not be found.


Action:

Consider defining a bean of type 'com.example.FitApp3.repository.FoodRepository' in your configuration.


Process finished with exit code 1

这是我的代码:

实体/食品。JAVA

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Food extends com.example.FitApp3.model.Entity {
    private String foodName;
    private int foodKcal;
    private int foodProtein;
    private int foodCarb;
    private int foodFat;

    public String getFoodName() {
        return foodName;
    }

    public void setFoodName(String foodName) {
        this.foodName = foodName;
    }

    public int getFoodKcal() {
        return foodKcal;
    }

    public void setFoodKcal(int foodKcal) {
        this.foodKcal = foodKcal;
    }

    public int getFoodProtein() {
        return foodProtein;
    }

    public void setFoodProtein(int foodProtein) {
        this.foodProtein = foodProtein;
    }

    public int getFoodCarb() {
        return foodCarb;
    }

    public void setFoodCarb(int foodCarb) {
        this.foodCarb = foodCarb;
    }

    public int getFoodFat() {
        return foodFat;
    }

    public void setFoodFat(int foodFat) {
        this.foodFat = foodFat;
    }
}

仓库/FoodRepository.java

public interface FoodRepository extends CrudRepository<Food, Integer> {}

控制器/食物控制器。JAVA

@RestController
public class FoodController {
    private FoodRepository foodRepository;

    public FoodController(FoodRepository foodRepository) {
        this.foodRepository = foodRepository;
    }
}

主课

@SpringBootApplication
public class FitApp3Application {
    public static void main(String[] args) {
        SpringApplication.run(FitApp3Application.class, args);
        System.out.println("hello world");
    }
}

波姆。xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>FitApp3</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>FitApp3</name>
    <description>Demo project for Spring Boot</description>
    <properties>
          <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
      <dependency>
          <groupId>javax.persistence</groupId>
          <artifactId>javax.persistence-api</artifactId>
          <version>2.2</version>
      </dependency>
      <dependency>
          <groupId>org.springframework.data</groupId>
          <artifactId>spring-data-commons</artifactId>
          <version>2.5.1</version>
      </dependency>
  </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

共有3个答案

颜华池
2023-03-14

我认为你只是对sping-jdbc、sping-data和sping持久性接口抽象有点困惑,让我来帮助你。TL; DR解决方案位于底部:

FoodController的构造函数中,您将FoodRepository声明为参数,因此Spring必须在运行时找到此时的bean,以便创建FoodController的bean。您已经声明了FoodRepository并从CrudRepository扩展它。我猜,你已经这样做了,假设Spring将在运行时创建一个FoodRepository的实现(因为它扩展了CrudRepository)。但是,不幸的是,它不是sping-core模块,它将创建FoodRepsitory的bean,也不是sping-jdbc。这些接口是Spring数据项目的一部分。因此,对于创建类型为FoodRepository的bean,负责类路径中的当前Spring数据项目(我的意思是,它可以是sping-data-jdbcsping-data-jpa或其他任何类型)。这些接口(CrudRepositoryRepositorye. t. c.)对于所有的Spring数据项目都是通用的,所以它们是在sping-data-Commonsjar中提供的,这就是为什么您在类路径中可以使用它们,因为您已经包含了sping-data-Commons显式:

  <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-commons</artifactId>
      <version>2.5.1</version>
  </dependency>

另一件事是,这个启动器:

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

不使用spring数据project——它只提供spring jdbc、Hikari连接池和其他一些Spring Boot功能。换句话说,问题是在类路径中没有任何spring数据项目,这就是为什么没有创建FoodRepositorybean的原因。

还要注意:@Entity在这里没有意义,因为类路径中没有任何jpa持久性提供程序

解决方案:

为了解决这个问题,我建议你

  1. pom中删除spring数据公用项依赖项。xml

希望有帮助,祝你有愉快的一天!

葛桐
2023-03-14

您需要用spring boot starter数据jpa替换spring boot starter jdbc,如下所示:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

您可以查看以下链接,看看它们之间的区别,但基本上,JPA通过将数据库数据直接映射到Java对象来帮助您处理数据库数据:

  • https://www.baeldung.com/jpa-vs-jdbc
  • JPA或JDBC,它们有什么不同?
严阳成
2023-03-14

你可以添加@Repository注释到FoodRepository接口。

@Repository
public interface FoodRepository extends CrudRepository<Food, Integer> {}
 类似资料:
  • 我正在浏览hibernate留档,文档说hibernate需要为我们所有的持久类提供一个no-arg构造函数: 无参数构造函数是所有持久类的要求;Hibernate必须使用Java反射为您创建对象。构造器可以是私有的,但是在没有字节码插装的情况下,运行时代理生成和有效的数据检索需要包或公共可见性。 但是当我通过创建一个没有任何无参数构造函数的POJO类并放置一个接受参数的构造函数来创建一个示例程序

  • 启动我的应用程序时出现问题。有人能帮我解决这个问题吗? 总报告 GenericRepositoryImpl 图书仓库搜索 图书服务 图书服务简介

  • 问题内容: 我的课如下: 在构造函数中的逻辑和是我试图嘲弄的事情。我想要任何调用:返回一个虚拟字符串。 我试过了: 但这似乎不起作用。仍在执行构造函数逻辑,而不是获取的模拟对象。 问题答案: 您发布的代码适用于最新版本的Mockito和Powermockito。也许您还没有准备A?试试这个: A.java MockA.java 两项测试均应通过Mockito 1.9.0,powermockito

  • 我试图构建一个包含getter和setter的构造函数,除了在参数中调用它之外,这些构造函数似乎对我的所有属性都很好。 当我读到这行代码时: 然后在控制台中出现以下错误: 构造函数flip(String)未定义构造函数flip(String)未定义 也许我错过了什么?

  • 实际上,我不明白无参数构造函数和默认构造函数的区别是什么。 在创建名为cFrame的Test对象时,是否调用此类的默认构造函数?

  • 我使用的是jdk8,需要创建一个以类名作为构造函数参数的Spring组件。但是,使用我当前的代码,我遇到了运行时错误: 这是我的博客类: 这就是我尝试创建类的方式: 我可以了解一下创建该组件的正确方法/这里出了什么问题吗?提前感谢。