Spring无法装配泛型Bean报No qualifying bean of type错误如何解决
错误原因
- Java泛型是编译期擦除的,运行时不会保留泛型参数类型信息。你给
GenericApprovalReader、GenericApprovalWriter标注了@Component,Spring自动注册Bean时,无法获知这两个泛型类的具体泛型参数T、U,只能将构造参数中的T processor擦除为顶层接口Process类型。 - 你的容器中共有11个
Process接口的实现类,Spring在注入Process类型参数时无法匹配到唯一实现,因此抛出NoUniqueBeanDefinitionException异常。 - Spring 4的泛型注入能力仅适用于注入点泛型参数可被明确解析为具体类型的场景,比如你直接注入
@Autowired Process<Item> processor,Spring可以识别泛型匹配到对应实现。但你当前是把泛型类本身注册为Bean,泛型参数处于未绑定状态,Spring无法完成自动匹配。
解决方案
你需要手动为每个Process实现类创建对应的Reader和Writer实例,不要让Spring自动注册泛型擦除后的通用实例:
- 先移除
GenericApprovalReader、GenericApprovalWriter类上的@Component、@StepScope注解。 - 在配置类中,为每个业务场景单独定义对应泛型参数的
Reader和WriterBean,示例如下:
// 针对FirstProcessor场景的Reader @Bean @StepScope public GenericApprovalReader<FirstProcessor, Item> firstProcessReader(SomeOtherBeanStepScopedBean otherBean, FirstProcessor firstProcessor) { return new GenericApprovalReader<>(otherBean, firstProcessor); } // 针对FirstProcessor场景的Writer @Bean @StepScope public GenericApprovalWriter<FirstProcessor, Item> firstProcessWriter(FirstProcessor firstProcessor) { return new GenericApprovalWriter<>(firstProcessor); }
- 定义Step时直接注入对应实例即可:
@Bean(name="firstProcessingStep") Step firstProcessingStep(GenericApprovalReader<FirstProcessor, Item> firstProcessReader, GenericApprovalWriter<FirstProcessor, Item> firstProcessWriter) { return stepBuilderFactory.get("firstProcessingStep") .<List<Item>,List<Item>>chunk(CHUNK_SIZE) .reader(firstProcessReader) .writer(firstProcessWriter) .allowStartIfComplete(false) .build(); }
补充说明
你的代码存在两处属性赋值笔误,运行时会抛出空指针异常,建议修正:
GenericApprovalReader构造方法中this.SomeOtherBean = otherBean改为this.otherBean = otherBeanGenericApprovalWriter构造方法中this.approvalProcessor = processor改为this.processor = processor
内容的提问来源于stack exchange,提问作者TheCoolDrop
相关产品推荐
相关产品推荐

