Spring Cloud Stream自定义通道报错:Bean 'input'已存在
解决Spring Cloud Stream自定义通道时Bean名称重复的问题
这个报错的原因一目了然——你把输入通道和输出通道都用了同一个名称Sink.INPUT(默认值是input),Spring在初始化Bean的时候发现有两个同名的Bean定义,直接就冲突报错了。
怎么解决?
核心就是给输入、输出通道分配独一无二的名称,不能共用同一个标识。给你两种常用的解决方式:
方式1:自定义完整的通道接口
推荐这种方式,更规范清晰:
import org.springframework.cloud.stream.annotation.Input; import org.springframework.cloud.stream.annotation.Output; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.SubscribableChannel; // 自定义包含输入和输出的通道接口 public interface CustomStreamChannels { // 输入通道名称(可以沿用Sink.INPUT,也可以自定义) String INPUT_CHANNEL = "input"; // 输出通道必须用和输入不同的名称 String OUTPUT_CHANNEL = "custom_output"; @Input(INPUT_CHANNEL) SubscribableChannel input(); @Output(OUTPUT_CHANNEL) MessageChannel output(); }
然后在启动类或者配置类上绑定这个接口:
import org.springframework.cloud.stream.annotation.EnableBinding; @EnableBinding(CustomStreamChannels.class) public class StreamApplication { // 后续可以注入CustomStreamChannels来操作通道 }
方式2:直接在注解中指定不同名称
如果不想自定义接口,也可以在使用@Input和@Output时直接指定不同的名称:
public class SinkSender { // 输入通道用默认的Sink.INPUT @Input(Sink.INPUT) SubscribableChannel input(); // 输出通道指定一个全新的名称,和input区分开 @Output("my_output") MessageChannel output(); }
关键提醒
Spring Cloud Stream里每个通道(无论输入还是输出)都会对应一个Bean,Bean的名称就是你在@Input/@Output中指定的值。所以只要保证这些值不重复,就不会出现这个冲突问题啦。
内容的提问来源于stack exchange,提问作者zzuoit
相关产品推荐
相关产品推荐

