Spring Boot枚举类标记@Service启动报错,自动注入失败
问题解决:Spring Boot枚举类加@Service启动报错的处理
错误原因
当给枚举类添加@Service注解后,Spring会尝试将其纳入容器管理,但枚举的构造方法是隐式接收一个String类型参数(枚举常量的名称),Spring会自动尝试注入这个String类型的依赖,而容器中并没有对应的String类型Bean,因此启动时抛出找不到Bean的错误。
测试模块中通过getInstance()正常访问,是因为直接调用枚举的单例实例,不受Spring容器的注入逻辑影响。
解决方案
方案:移除枚举类上的@Service,通过配置类手动注册Bean
保留枚举本身的单例特性,同时让Spring容器能够管理该实例,满足自动注入的需求:
- 修改枚举类:移除
@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); } }
- 添加配置类:手动将枚举实例注册为Spring Bean
@Configuration public class RepositoryConfig { @Bean public LockerRepo lockerRepo() { return LockerRepo.INSTANCE; } }
效果验证
修改后,其他类既可以通过@Autowired自动注入LockerRepo实例,也能继续使用LockerRepo.getInstance()直接调用,同时Spring启动时不会再抛出找不到String类型Bean的错误。
内容的提问来源于stack exchange,提问作者Kiemoon
相关产品推荐
相关产品推荐

