You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot枚举类标记@Service启动报错,自动注入失败

问题解决:Spring Boot枚举类加@Service启动报错的处理

错误原因

当给枚举类添加@Service注解后,Spring会尝试将其纳入容器管理,但枚举的构造方法是隐式接收一个String类型参数(枚举常量的名称),Spring会自动尝试注入这个String类型的依赖,而容器中并没有对应的String类型Bean,因此启动时抛出找不到Bean的错误。

测试模块中通过getInstance()正常访问,是因为直接调用枚举的单例实例,不受Spring容器的注入逻辑影响。

解决方案

方案:移除枚举类上的@Service,通过配置类手动注册Bean

保留枚举本身的单例特性,同时让Spring容器能够管理该实例,满足自动注入的需求:

  1. 修改枚举类:移除@Service注解,修复原代码中的逻辑bug(1>30改为i>30)
public enum LockerRepo {
    INSTANCE;

    private static List<Locker> lockerList = new ArrayList<>(generateExampleData());
    
    private static List<Locker> generateExampleData() {
        List<Locker> exampleList = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
            if (i <= 30) {
                exampleList.add(new Locker(i, Size.S));
            } else if (i > 30 && i <= 70) {
                exampleList.add(new Locker(i, Size.M));
            } else {
                exampleList.add(new Locker(i, Size.L));
            }
        }

        return exampleList;
    }

    public static LockerRepo getInstance() {
        return INSTANCE;
    }

    // 按需添加业务方法,比如获取储物柜列表
    public List<Locker> getLockerList() {
        return Collections.unmodifiableList(lockerList);
    }
}
  1. 添加配置类:手动将枚举实例注册为Spring Bean
@Configuration
public class RepositoryConfig {
    @Bean
    public LockerRepo lockerRepo() {
        return LockerRepo.INSTANCE;
    }
}

效果验证

修改后,其他类既可以通过@Autowired自动注入LockerRepo实例,也能继续使用LockerRepo.getInstance()直接调用,同时Spring启动时不会再抛出找不到String类型Bean的错误。

内容的提问来源于stack exchange,提问作者Kiemoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:10:42