【Spring】找不到Bean

0.叠甲

博主是一个编程菜鸟,所以如有什么写的不正确或有误的部分请诸君友善交流,如果对诸位有帮助的话也请点个赞鼓励一下吧,非常感谢
另:解决问题直接查看GPT的回答

1.问题描述

1.1. 报错

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
22:28:52:401 ERROR 29164 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field appointmentService in com.hospital_physical_examination_system.appointment.controller.AppointmentController required a bean of type 'com.hospital_physical_examination_system.appointment.service.AppointmentService' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.hospital_physical_examination_system.appointment.service.AppointmentService' in your configuration.

Disconnected from the target VM, address: '127.0.0.1:10653', transport: 'socket'

Process finished with exit code 1

1.2. 项目结构

在这里插入图片描述

1.3. 代码

1.3.1. 启动类

@Import({DatabaseConfig.class, WebMvcConfig.class})
@SpringBootApplication(scanBasePackages = {"com.hospital_physical_examination_system.appointment.controller"})
public class AppointmentApplication {
    public static void main(String[] args) {
        SpringApplication.run(AppointmentApplication.class, args);
    }
}

1.3.2. Controller

@Controller
@RequestMapping("/appointment")
public class AppointmentController {

    @Autowired
    private AppointmentService appointmentService;

    /**
     * <p>
     * 获取预约列表页面
     * </p>
     * @author :
     * @date 2024/4/16 19:35
     */
    @ResponseBody
    @PostMapping("/getAppointmentPage")
    //加上了用户信息的拦截器就不需要在这里再获取数据了,拦截器:com.hpes.common.interceptors.UserInfoInterceptor
//    public void getAppointmentPage(@RequestHeader(value = "user-info", required = false) String userInfo){
    public String getAppointmentPage(){
        java代码
    }
}

1.3.3. Service层

接口
public interface AppointmentService extends IService<Appointment> {
    List<AppointmentSimpleInfoPO> getAppointmentSimpleInfoList(UserDTO userDTO);
}
实现类
@Service
public class AppointmentServiceImpl extends ServiceImpl<AppointmentMapper, Appointment> implements AppointmentService {

    @Autowired
    private AppointmentMapper appointmentMapper;
    @Override
    public List<AppointmentSimpleInfoPO> getAppointmentSimpleInfoList(UserDTO userDTO) {
        return appointmentMapper.getAppointmentSimpleInfoList(userDTO.getUserId());
    }
}

1.3.4.Mapper接口与文件

接口
@Mapper
public interface AppointmentMapper extends BaseMapper<Appointment> {
    List<AppointmentSimpleInfoPO> getAppointmentSimpleInfoList(String userId);
}
映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hospital_physical_examination_system.appointment.mapper.AppointmentMapper">
    <select id="getAppointmentSimpleInfoList"
            resultType="com.hospital_physical_examination_system.api.po.AppointmentSimpleInfoPO">
        SQL代码
    </select>
</mapper>

2.GPT的回答

Spring Boot 报告找不到名为 com.hospital_physical_examination_system.appointment.serviceImpl.AppointmentServiceImpl 的 bean 时,通常意味着 Spring 容器在尝试自动装配一个组件时遇到了问题,因为它无法找到一个匹配的 bean 来注入。以下是一些可能导致这个错误的原因:

  1. 组件扫描未配置正确:如果 AppointmentServiceImpl 类没有被 Spring 扫描到,可能是因为 @ComponentScan 配置不正确,或者类不在指定的包路径下。

  2. 缺少注解AppointmentServiceImpl 类可能缺少必要的 Spring 组件注解,如 @Service@Component

  3. 类路径问题:如果 AppointmentServiceImpl 类在项目的类路径之外,Spring 容器将无法找到它。

  4. 包结构错误:如果 AppointmentServiceImpl 类不在正确的包中,或者包名拼写错误,Spring 也无法扫描到该类。

  5. 编译问题:如果 AppointmentServiceImpl 类有编译错误,或者该类尚未编译,它将不会被包含在构建的 JAR 或 WAR 文件中。

  6. 上下文配置问题:如果您在 Spring Boot 应用程序中使用了多个配置文件或上下文,可能会遇到一个上下文能够访问该 bean,而另一个上下文无法访问的情况。

  7. 配置类问题:如果您使用 Java 配置类来定义 beans,可能是因为缺少了 @Bean 方法来声明 AppointmentServiceImpl

  8. Bean 定义问题:如果 AppointmentServiceImpl 是通过 Java 配置或 XML 配置显式定义的,可能是定义中存在错误,或者该 bean 被标记为懒加载(lazy-init=true),在这种情况下,直到 bean 被实际使用之前,Spring 容器不会创建它。

  9. 循环依赖:在某些情况下,循环依赖可能会导致 Spring 容器无法正确创建 beans。

  10. 类名拼写错误:请检查错误消息中的类名是否与实际类名完全匹配,包括大小写。

为了解决这个问题,您可以尝试以下步骤:

  • 确保 AppointmentServiceImpl 类上有正确的 Spring 组件注解,如 @Service
  • 检查 AppointmentServiceImpl 类是否在 Spring Boot 的 @ComponentScan 路径下。
  • 确保 AppointmentServiceImpl 类正确编译,并且没有类路径问题。
  • 如果使用 Java 配置,请确保有相应的 @Bean 方法声明。
  • 检查是否有任何拼写错误或包结构问题。
  • 如果问题仍然存在,尝试启动应用程序并查看启动日志,以获取更多关于无法找到该 bean 的详细信息。

如果问题仍然无法解决,您可能需要提供更多的上下文信息,如项目结构、配置类或任何相关的代码片段,以便进行更深入的分析。

3.实际的原因

画蛇添足为启动类的@SpringBootApplication注解添加了scanBasePackages属性,而且还把扫描包范围限制在controller包下了,导致扫描不到Service层的代码

启动类改为下面这样就没有问题了:

@Import({DatabaseConfig.class, WebMvcConfig.class})
@SpringBootApplication()
public class AppointmentApplication {
    public static void main(String[] args) {
        SpringApplication.run(AppointmentApplication.class, args);
    }
}
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值