无法将 DEFAULT_STREAMS_CONFIG_BEAN_NAME 标记为主要

Cannot mark DEFAULT_STREAMS_CONFIG_BEAN_NAME as Primary

我刚刚升级到 spring-boot 2.1.3.RELEASE 并且由于这个新的 class/ 方法(kafkaStreamsFactoryBeanConfigurer 完全需要一个 factoryBean):

@Configuration
@ConditionalOnClass(StreamsBuilder.class)
@ConditionalOnBean(name = 
KafkaStreamsDefaultConfiguration.DEFAULT_STREAMS_BUILDER_BEAN_NAME)
class KafkaStreamsAnnotationDrivenConfiguration {
 //...
 @Bean
 public KafkaStreamsFactoryBeanConfigurer kafkaStreamsFactoryBeanConfigurer(
        StreamsBuilderFactoryBean factoryBean) {
    return new KafkaStreamsFactoryBeanConfigurer(this.properties, factoryBean);
 }
}

我收到这个错误:

Parameter 0 of method kafkaStreamsFactoryBeanConfigurer in org.springframework.boot.autoconfigure.kafka.KafkaStreamsAnnotationDrivenConfiguration required a single bean, but 2 were found:
- &defaultKafkaStreamsBuilder: defined by method 'defaultKafkaStreamsBuilder' in class path resource [com/elsevier/q2c/transaction/snapshot/builder/config/KafkaStreamsConfig.class]
- &snapshotKafkaStreamsBuilder: defined by method 'snapshotKafkaStreamsBuilder' in class path resource [com/elsevier/q2c/transaction/snapshot/builder/config/KafkaStreamsConfig.class]

我希望通过将两个 StreamsBuilderFactoryBean 中的一个标记为 @Primary(建议 )来解决这个问题。但即使我这样做:

@Bean(name = KafkaStreamsDefaultConfiguration.DEFAULT_STREAMS_BUILDER_BEAN_NAME)
@Primary
public StreamsBuilderFactoryBean defaultKafkaStreamsBuilder(
        @Qualifier(KafkaStreamsDefaultConfiguration.DEFAULT_STREAMS_CONFIG_BEAN_NAME) KafkaStreamsConfiguration streamsConfiguration) {
    StreamsBuilderFactoryBean streamsBuilderFactoryBean = new StreamsBuilderFactoryBean(streamsConfiguration);
    return streamsBuilderFactoryBean;
}

@Bean(name = SNAPSHOT_STREAMS_BUILDER_BEAN_NAME)
public StreamsBuilderFactoryBean snapshotKafkaStreamsBuilder(
        @Qualifier(SNAPSHOT_STREAMS_CONFIG_BEAN_NAME) KafkaStreamsConfiguration streamsConfiguration) {
    StreamsBuilderFactoryBean streamsBuilderFactoryBean = new StreamsBuilderFactoryBean(streamsConfiguration);
    return streamsBuilderFactoryBean;
}

我仍然得到完全相同的错误。

我在想,也许 @Primary 使构造的 bean 成为主要的。非常感谢任何帮助!

编辑:我通过删除 @EnableKafkaStreamsDEFAULT_STREAMS_BUILDER_BEAN_NAME 绕过了这个问题。结果,KafkaStreamsFactoryBeanConfigurer 没有启动。

我不确定为什么 @Primary 不起作用。我开了一个GitHub issue.

在我的例子中,我通过删除@EnableKafkaStreams(即没有自动创建流 bean)来规避这个问题,并且我手动创建了所有需要的流 bean。如果您有多个流,那么看起来会更好,因为命名也可能更具破坏性。