【问题标题】:Error in fetching table through JpaRepository通过 JpaRepository 取表出错
【发布时间】:2023-01-17 20:52:30
【问题描述】:

我正在尝试使用 JpaRepository 从 MySQL 中的表中获取数据。 我通过运行像这样的代码来获取错误 -

创建名称为“chassiscontroller”的 bean 时出错:通过字段“service”表示不满足的依赖关系:创建名称为“chassisserviceimpl”的 bean 时出错:通过字段“dao”表示的不满足依赖关系:创建名称为“chassisdao”的 bean 在 com.ChassisInfo 中定义时出错。 chassis.dao.chassisdao 在 JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration 上声明的@EnableJpaRepositories 中定义:不是托管类型:类 com.ChassisInfo.model.chassismodel。

控制器

package com.ChassisInfo.chassis.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;
import com.ChassisInfo.chassis.service.chassisService;
import com.ChassisInfo.model.chassismodel;

@RestController
public class Chassiscontroller {
    
    @Autowired
    private chassisService service;
    
    @GetMapping("/chnum")
    public List<chassismodel> getchassisnumberinfo(){
        
        return service.getchassisnumberinfo();
        
    }

}

服务-

package com.ChassisInfo.chassis.service;

import java.util.List;

import com.ChassisInfo.model.chassismodel;

public interface chassisService{

    

    List<chassismodel> getchassisnumberinfo();
    

}

服务实施-

package com.ChassisInfo.chassis.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ChassisInfo.chassis.dao.chassisdao;
import com.ChassisInfo.model.chassismodel;


@Service
public class chassisserviceimpl implements chassisService {
    
    @Autowired
    private chassisdao dao;

    @Override
    public List<chassismodel> getchassisnumberinfo() {
        // TODO Auto-generated method stub
        return dao.findbychassisNumber();
    }

    
    
    

}

道-

package com.ChassisInfo.chassis.dao;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.ChassisInfo.model.chassismodel;

@Repository
public interface chassisdao extends JpaRepository<chassismodel,String> {
   
   @Query("Select * from chassis_master")
    List<chassismodel> findbychassisNumber();
}

模型-

package com.ChassisInfo.model;

public class chassismodel {
    private String vin;
    private String active;
    private String chassisNumber;
    private String chassisSeries;
    private String statusChangedTime;
    private String tag;
    private String truckid;
    private String id;
    private String chassis_number;
    private String chassis_series;
    private String status_changed_time;
    private String truck_id;
    
    public String getVin() {
        return vin;
    }

    public void setVin(String vin) {
        this.vin = vin;
    }

    public String getActive() {
        return active;
    }

    public void setActive(String active) {
        this.active = active;
    }

    public String getChassisSeries() {
        return chassisSeries;
    }

    public void setChassisSeries(String chassisSeries) {
        this.chassisSeries = chassisSeries;
    }

    public String getStatusChangedTime() {
        return statusChangedTime;
    }

    public void setStatusChangedTime(String statusChangedTime) {
        this.statusChangedTime = statusChangedTime;
    }

    public String getTag() {
        return tag;
    }

    public void setTag(String tag) {
        this.tag = tag;
    }

    public String getTruckid() {
        return truckid;
    }

    public void setTruckid(String truckid) {
        this.truckid = truckid;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getChassis_number() {
        return chassis_number;
    }

    public void setChassis_number(String chassis_number) {
        this.chassis_number = chassis_number;
    }

    public String getChassis_series() {
        return chassis_series;
    }

    public void setChassis_series(String chassis_series) {
        this.chassis_series = chassis_series;
    }

    public String getStatus_changed_time() {
        return status_changed_time;
    }

    public void setStatus_changed_time(String status_changed_time) {
        this.status_changed_time = status_changed_time;
    }

    public String getTruck_id() {
        return truck_id;
    }

    public void setTruck_id(String truck_id) {
        this.truck_id = truck_id;
    }

    public String getChassisNumber() {
        return chassisNumber;
    }

    public void setChassisNumber(String chassisNumber) {
        this.chassisNumber = chassisNumber;
    }

}

【问题讨论】:

  • 您的模型不是一个实体,那么它应该如何工作?您正在使用 JPA,请使用正确的映射。
  • “试图从 MySQL 中的表中获取数据”和“使用 JpaRepository”似乎已经暗示是一种误解。使用 JPA,您应该考虑实体它们表示为 Java 类并映射到表。因此,当您获取数据时,您获取的是实体,只有在极少数情况下,到表的映射才有意义(这当然很重要,但通常对于获取代码而言并不重要)。所以停止思考“表格”,开始思考“实体”。
  • 您的代码中还有其他几个问题:1)命名:您应该阅读 Java 代码约定并遵守它们,例如类名以大写字母开头,几乎所有其他名称都以小写字母开头。 2) 您需要阅读 Spring 的“查询方法”,即 findbychassisNumber() 将通过“chassisNumber”(尽管名称有些错误)表示加载,这也需要将数字作为参数传递。 3)当你使用像Select * from chassis_master这样的本地查询并让 Spring 在您不需要(或不知道您必须)时做它的事情。

标签: java spring spring-boot spring-data-jpa


【解决方案1】:

这可能是因为您在 @SpringBootApplication 中缺少 @EnableJpaRepositories(basePackages = "your.package.name")

这是启用 JPA 存储库的注解。默认会扫描Spring Data repositories注解配置类的包。

【讨论】:

    【解决方案2】:

    尝试在 chassisserviceimpl 中使用 @RequiredArgsConstructor (lombok),因为自动装配无法访问 dao 字段。还要为该字段添加 final:

    private final chassisdao dao;
    

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多