微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用控制器创建 bean 时出错面临自动装配和限定符注释的问题

如何解决使用控制器创建 bean 时出错面临自动装配和限定符注释的问题

我正在创建一个预约医生预约的应用程序。在这里,我在 pojo 类中有 7 个类

在 com.capg.bookmydoctor.dto 包内,我有 7 个 pojo 类:

com.capg.bookmydoctor.dto

Admin.java
Appointment.java
Availability.java
Doctor.java
Feedback.java
Patient.java
User.java

在Dao里面我得到了5个Dao方法接口和5个Dao Repository接口

com.capg.bookmydoctor.dao


IAdminDao.java

-------------------------------------------------------------------------------------

package com.capg.bookmydoctor.dao;

import com.capg.bookmydoctor.dto.Admin;

public interface IAdminDao {


        public Admin addAdmin(Admin admin);
        public Admin updateAdmin(Admin admin);
        public Admin removeAdmin(Admin admin);
        public Admin viewAdmin(Admin admin);

    }

-------------------------------------------------------------------------------------

IAdminDaoRepository.java

-------------------------------------------------------------------------------------

package com.capg.bookmydoctor.dao;

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

import com.capg.bookmydoctor.dto.Admin;

@Repository("IAdminDao")
public interface IAdminRepository extends IAdminDao,JpaRepository<Admin,Integer>{

}

这里我只嵌入了一个 Dao 接口和一个 Dao Repository 接口代码,以减少问题。其余接口类似。

IAppointmentDao.java
IAppointmentRepository.java

IDoctorDao.java
IDoctorRepository.java

IFeedbackDao.java
IFeedbackRepository.java

IPatientDao.java
IPatientRepository.java

在服务包里面,我得到了 5 个服务方法接口和 5 个服务实现类

我猜由于这些服务类,我收到错误,因为即使我使用了 @Autowired 和 @Qualifier 注释,我的主类也无法找到服务类。

com.capg.bookmydoctor.service 

IAdminService.java

-------------------------------------------------------------------------------------

package com.capg.bookmydoctor.service;

import com.capg.bookmydoctor.dto.Admin;

public interface IAdminService {


    public Admin addAdmin(Admin admin);
    public Admin updateAdmin(Admin admin);
    public Admin removeAdmin(Admin admin);
    public Admin viewAdmin(Admin admin);

    }

-------------------------------------------------------------------------------------

IAdminServiceImpl.java

-------------------------------------------------------------------------------------

package com.capg.bookmydoctor.service;

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

import com.capg.bookmydoctor.dao.IAdminRepository;
import com.capg.bookmydoctor.dto.Admin;

@Service("IAdminService")
public class IAdminServiceImpl implements  IAdminService {

    @Autowired
    @Qualifier("IAdminRepository")
    IAdminRepository adminDao;

    @Override
    public Admin addAdmin(Admin admin) {
        return adminDao.addAdmin(admin);
    }

    @Override
    public Admin updateAdmin(Admin admin) {
        return adminDao.updateAdmin(admin);
    }

    @Override
    public Admin removeAdmin(Admin admin) {
        return adminDao.removeAdmin(admin);
    }

   @Override
    public Admin viewAdmin(Admin admin) {
        return adminDao.viewAdmin(admin);
    }

    }

这里我只嵌入了一个服务实现类代码以减少问题。其余服务实现类类似,只是变量和方法不同。

IAppointmentService.java
IAppointmentServiceImpl.java


IDoctorService.java
IDoctorServiceImpl.java

IFeedbackService.java
IFeedbackServiceImpl.java

IPatientService.java
IPatientServiceImpl.java

这里在控制器包里面我有一个

com.capg.bookmydoctor.controller

BookMyDoctorController.java

package com.capg.bookmydoctor.controller;

import java.time.LocalDate;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.capg.bookmydoctor.dto.Admin;
import com.capg.bookmydoctor.dto.Appointment;
import com.capg.bookmydoctor.dto.AvailabilityDates;
import com.capg.bookmydoctor.dto.Doctor;
import com.capg.bookmydoctor.dto.FeedBack;
import com.capg.bookmydoctor.dto.Patient;
import com.capg.bookmydoctor.service.IAdminService;
import com.capg.bookmydoctor.service.IAppointmentService;
import com.capg.bookmydoctor.service.IDoctorService;
import com.capg.bookmydoctor.service.IFeedbackService;
import com.capg.bookmydoctor.service.IPatientService;

@RestController
@RequestMapping("/doctor")
public class BookMyDoctorController {

    @Autowired
    @Qualifier("IAdminService")
    IAdminService adminService;

    @Autowired
    @Qualifier("IAppointmentService")
    IAppointmentService appointmentService;

    @Autowired
    @Qualifier("IDoctorService")
    IDoctorService doctorService;

    @Autowired
    @Qualifier("IFeedbackService")
    IFeedbackService FeedbackService;

    @Autowired
    @Qualifier("IPatientService")
    IPatientService patientService;

    @PostMapping("/admin")
    public Admin addAdmin(@RequestBody Admin admin) {
        return adminService.addAdmin(admin);
    }

    @PutMapping("/admin")
    public Admin updateAdmin(@RequestBody Admin admin) {
        return adminService.updateAdmin(admin);
   }

    @DeleteMapping("/admin")
    public Admin removeAdmin(@RequestBody Admin admin) {
        return adminService.removeAdmin(admin);
    }

    @GetMapping("/admin")
    public Admin viewAdmin(@RequestBody Admin admin) {
        return adminService.viewAdmin(admin);
     }

    @GetMapping("/appointment")
    public List<Appointment> getAllAppointments() {
        return appointmentService.getAllAppointments();
    }

    @GetMapping("/Feedback/all")
    public List<FeedBack> getAllFeedback(@RequestBody Doctor doc) {
        return FeedbackService.getAllFeedback(doc);
    }

    @PostMapping("/patient")
    public Patient addPatient(@RequestBody Patient bean) {
        return patientService.addPatient(bean);
    }

    @PutMapping("/patient")
    public Patient editPatientProfile(@RequestBody Patient bean) {
        return patientService.editPatientProfile(bean);
    }

    @DeleteMapping("/patient")
    public Patient removePatientDetails(@RequestBody Patient bean) {
        return patientService.removePatientDetails(bean);
    }

    @GetMapping("/patient")
    public Patient getPatient(@RequestBody Patient patient) {
        return patientService.getPatient(patient);
    }

    @GetMapping("/patient/all")
    public List<Patient> getAllPatient() {
        return patientService.getAllPatient();
    }

    @GetMapping("/patient/doctor")
    public List<Patient> getPatientListByDoctor(@RequestBody Doctor doctor) {
        return patientService.getPatientListByDoctor(doctor);
    }

    @GetMapping("/patient/{appdate}")
    public List<Patient> getPatientListByDate(@PathVariable LocalDate appdate) {
        return patientService.getPatientListByDate(appdate);
    }

在 com.capg.bookmydoctor 包内,我得到了 Spring Boot 应用类

com.capg.bookmydoctor 

package com.capg.bookmydoctor;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("com.capg.bookmydoctor.controller,com.capg.bookmydoctor.dao,com.capg.bookmydoctor.service,com.capg.bookmydoctor.dto")
public class BookMyDoctorAppApplication {

        public static void main(String[] args) {
            SpringApplication.run(BookMyDoctorAppApplication.class,args);
        }

    }

这里我对所有包都使用了相同的包名“com.capg.bookmydoctor”。

这里我对所有服务实现类使用了@Service注解,并在其中指定了服务接口名称

因为我有不同的 Respositories 和 Service Implementation 类,所以我在 @Autowired 中使用了 @Qualifier 注释。

尽管做了这一切,我还是在控制台中收到了这些错误

错误

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookMyDoctorController': Unsatisfied dependency expressed through field 'adminService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'IAdminService': Unsatisfied dependency expressed through field 'adminDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDeFinitionException: No qualifying bean of type 'com.capg.bookmydoctor.dao.IAdminRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true),@org.springframework.beans.factory.annotation.Qualifier(value=IAdminRepository)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessproperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.populateBean(AbstractAutowireCapablebeanfactory.java:1413) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:601) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:524) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.Abstractbeanfactory.lambda$doGetBean$0(Abstractbeanfactory.java:335) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:333) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:208) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.DefaultListablebeanfactory.preInstantiateSingletons(DefaultListablebeanfactory.java:944) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.context.support.AbstractApplicationContext.finishbeanfactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.5.jar:5.3.5]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.5.jar:5.3.5]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.4.jar:2.4.4]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:769) [spring-boot-2.4.4.jar:2.4.4]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) [spring-boot-2.4.4.jar:2.4.4]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) [spring-boot-2.4.4.jar:2.4.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) [spring-boot-2.4.4.jar:2.4.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1313) [spring-boot-2.4.4.jar:2.4.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) [spring-boot-2.4.4.jar:2.4.4]
at com.capg.bookmydoctor.BookMyDoctorAppApplication.main(BookMyDoctorAppApplication.java:12) [classes/:na]

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'IAdminService': Unsatisfied dependency expressed through field 'adminDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDeFinitionException: No qualifying bean of type 'com.capg.bookmydoctor.dao.IAdminRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true),@org.springframework.beans.factory.annotation.Qualifier(value=IAdminRepository)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessproperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.populateBean(AbstractAutowireCapablebeanfactory.java:1413) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:601) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:524) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.Abstractbeanfactory.lambda$doGetBean$0(Abstractbeanfactory.java:335) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:333) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:208) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.DefaultListablebeanfactory.doResolveDependency(DefaultListablebeanfactory.java:1380) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.DefaultListablebeanfactory.resolveDependency(DefaultListablebeanfactory.java:1300) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657) ~[spring-beans-5.3.5.jar:5.3.5]
... 21 common frames omitted

Caused by: org.springframework.beans.factory.NoSuchBeanDeFinitionException: No qualifying bean of type 'com.capg.bookmydoctor.dao.IAdminRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true),@org.springframework.beans.factory.annotation.Qualifier(value=IAdminRepository)}
at org.springframework.beans.factory.support.DefaultListablebeanfactory.raiseNoMatchingBeanFound(DefaultListablebeanfactory.java:1790) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.DefaultListablebeanfactory.doResolveDependency(DefaultListablebeanfactory.java:1346) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.support.DefaultListablebeanfactory.resolveDependency(DefaultListablebeanfactory.java:1300) ~[spring-beans-5.3.5.jar:5.3.5]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657) ~[spring-beans-5.3.5.jar:5.3.5]
... 35 common frames omitted

请帮助我摆脱这些错误

谢谢...

解决方法

IAdminRepository 中,bean 的名称是 "IAdminDao"

package com.capg.bookmydoctor.dao;

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

import com.capg.bookmydoctor.dto.Admin;

@Repository("IAdminDao")
public interface IAdminRepository extends IAdminDao,JpaRepository<Admin,Integer>{

}

在服务类 IAdminServiceImpl 中,您使用错误的 Qualifier 自动装配:

    @Autowired
    @Qualifier("IAdminRepository")
    IAdminRepository adminDao;

应该是:

    @Autowired
    @Qualifier("IAdminDao")
    IAdminRepository adminDao;

您应该在其他 DAO/Service 类中检查这一点。

,

您一直使用错误的注释。如果您将名称传递给像 @Repository("IAdminDao") 这样的注释,那么您正在创建名称为“IAdminDao”的 bean,它应该使用 @Autowire @Qualifier(IAdminDao) 自动装配,但您正在做的是 @Qualifier("IAdminRepository")由于没有具有此名称的 bean,因此您会收到错误消息。

如果接口只有单个实现,则删除所有限定符,并从用于接口/类的注释中删除名称,例如。只写@Repository,@Service。然后使用@Autowired。如果 bean 依赖是唯一的问题,这应该会启动您的应用程序。或者使用 spring 文档中描述的 bean 命名。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?