@MessagingGateway注解接口未注册为Spring IOC Bean启动报错
故障根因
@MessagingGateway标注的接口不属于Spring常规组件扫描的范畴,Spring默认不会为这类接口生成代理Bean,必须显式开启Spring Integration的组件扫描能力,才会识别并注册网关代理对象,这是启动报找不到LionGateway类型Bean的核心原因。
另外现有集成配置代码里还存在几处会引发后续运行异常的隐患,需要一并修复。
修复方案
- 开启集成组件扫描
二选一即可:- 在根包下的主启动类上添加
@IntegrationComponentScan注解,主启动类位于com.example包下,添加后会自动扫描所有子包中标注@MessagingGateway的接口,生成代理Bean注册到容器:
@SpringBootApplication @IntegrationComponentScan public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }- 也可以直接在现有
IntegrationConfiguration配置类上添加@IntegrationComponentScan注解,效果一致。
- 在根包下的主启动类上添加
- 修复配置类的依赖注入缺失问题
现有IntegrationConfiguration中三个子流都调用了lionService的方法,但类中只注入了LoansServiceImpl,缺少LionService的注入声明,补全即可:@Autowired private LionService lionService; - 修正流中的类型转换逻辑错误
主流程中写了.convert(LoanProvisionRequest.class)逻辑,但网关传入的payload类型是LionRequest,后续三个子流也都是按LionRequest类型做的强转,这行类型转换会触发运行时类转换异常,要么将转换目标类型改为LionRequest,要么直接删除这行不符合业务逻辑的转换代码。 - 规范通道Bean定义
现有replyChannel方法定义的Bean名称和实际指定的通道名output-flow不一致,容易引发重复创建通道的问题,建议将Bean名调整为和通道名对应:@Bean public MessageChannel outputFlowChannel() { return MessageChannels.executor("output-flow", outputExecutor()).get(); }
完成以上修改后重启应用,LionGateway的代理Bean会被正常注册,Controller层的注入可以正常完成,集成流也能正常触发。
内容的提问来源于stack exchange,提问作者Somnath Mukherjee
相关产品推荐
相关产品推荐

