Missing beans registration in Kafka Streams binder
There are duplicate code in various binder configurations where we register missing beans. Consolidate them into a common class that implements ImportBeanDefinitionRegistrar and then import this class in the binder configurations. Resolves #445
This commit is contained in:
@@ -67,7 +67,7 @@ public class GlobalKTableBinder extends
|
||||
if (!StringUtils.hasText(group)) {
|
||||
group = binderConfigurationProperties.getApplicationId();
|
||||
}
|
||||
KafkaStreamsConsumerBindingUtils.prepareConsumerBinding(name, group, inputTarget,
|
||||
KafkaStreamsBinderUtils.prepareConsumerBinding(name, group, inputTarget,
|
||||
getApplicationContext(),
|
||||
kafkaTopicProvisioner,
|
||||
kafkaStreamsBindingInformationCatalogue,
|
||||
|
||||
@@ -16,10 +16,6 @@
|
||||
|
||||
package org.springframework.cloud.stream.binder.kafka.streams;
|
||||
|
||||
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
|
||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
|
||||
import org.springframework.cloud.stream.binder.kafka.properties.KafkaBinderConfigurationProperties;
|
||||
import org.springframework.cloud.stream.binder.kafka.provisioning.KafkaTopicProvisioner;
|
||||
@@ -27,45 +23,15 @@ import org.springframework.cloud.stream.binder.kafka.streams.properties.KafkaStr
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
|
||||
import org.springframework.core.type.AnnotationMetadata;
|
||||
|
||||
/**
|
||||
* @author Soby Chacko
|
||||
* @since 2.1.0
|
||||
*/
|
||||
@Configuration
|
||||
@Import(GlobalKTableBinderConfiguration.Registrar.class)
|
||||
@Import(KafkaStreamsBinderUtils.KafkaStreamsMissingBeansRegistrar.class)
|
||||
public class GlobalKTableBinderConfiguration {
|
||||
|
||||
static class Registrar implements ImportBeanDefinitionRegistrar {
|
||||
|
||||
private static final String BEAN_NAME = "outerContext";
|
||||
|
||||
@Override
|
||||
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
|
||||
BeanDefinitionRegistry registry) {
|
||||
if (registry.containsBeanDefinition(BEAN_NAME)) {
|
||||
|
||||
AbstractBeanDefinition configBean = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingFactoryBean.class)
|
||||
.addPropertyReference("targetObject", BEAN_NAME)
|
||||
.addPropertyValue("targetMethod", "getBean")
|
||||
.addPropertyValue("arguments", KafkaStreamsBinderConfigurationProperties.class)
|
||||
.getBeanDefinition();
|
||||
|
||||
registry.registerBeanDefinition(KafkaStreamsBinderConfigurationProperties.class.getSimpleName(), configBean);
|
||||
|
||||
AbstractBeanDefinition catalogueBean = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingFactoryBean.class)
|
||||
.addPropertyReference("targetObject", BEAN_NAME)
|
||||
.addPropertyValue("targetMethod", "getBean")
|
||||
.addPropertyValue("arguments", KafkaStreamsBindingInformationCatalogue.class)
|
||||
.getBeanDefinition();
|
||||
|
||||
registry.registerBeanDefinition(KafkaStreamsBindingInformationCatalogue.class.getSimpleName(), catalogueBean);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Bean
|
||||
public KafkaTopicProvisioner provisioningProvider(KafkaBinderConfigurationProperties binderConfigurationProperties,
|
||||
KafkaProperties kafkaProperties) {
|
||||
|
||||
@@ -85,7 +85,7 @@ class KStreamBinder extends
|
||||
if (!StringUtils.hasText(group)) {
|
||||
group = binderConfigurationProperties.getApplicationId();
|
||||
}
|
||||
KafkaStreamsConsumerBindingUtils.prepareConsumerBinding(name, group, inputTarget,
|
||||
KafkaStreamsBinderUtils.prepareConsumerBinding(name, group, inputTarget,
|
||||
getApplicationContext(),
|
||||
kafkaTopicProvisioner,
|
||||
kafkaStreamsBindingInformationCatalogue,
|
||||
|
||||
@@ -16,18 +16,20 @@
|
||||
|
||||
package org.springframework.cloud.stream.binder.kafka.streams;
|
||||
|
||||
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
|
||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||
import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
|
||||
import org.springframework.cloud.stream.binder.kafka.properties.KafkaBinderConfigurationProperties;
|
||||
import org.springframework.cloud.stream.binder.kafka.provisioning.KafkaTopicProvisioner;
|
||||
import org.springframework.cloud.stream.binder.kafka.streams.properties.KafkaStreamsBinderConfigurationProperties;
|
||||
import org.springframework.cloud.stream.binder.kafka.streams.properties.KafkaStreamsExtendedBindingProperties;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.core.type.AnnotationMetadata;
|
||||
|
||||
/**
|
||||
* @author Marius Bogoevici
|
||||
@@ -35,25 +37,45 @@ import org.springframework.context.annotation.Import;
|
||||
* @author Soby Chacko
|
||||
*/
|
||||
@Configuration
|
||||
@Import({KafkaAutoConfiguration.class})
|
||||
@Import({KafkaAutoConfiguration.class, KStreamBinderConfiguration.KStreamMissingBeansRegistrar.class})
|
||||
public class KStreamBinderConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnBean(name = "outerContext")
|
||||
public BeanFactoryPostProcessor outerContextBeanFactoryPostProcessor() {
|
||||
return beanFactory -> {
|
||||
ApplicationContext outerContext = (ApplicationContext) beanFactory.getBean("outerContext");
|
||||
beanFactory.registerSingleton(KafkaStreamsBinderConfigurationProperties.class.getSimpleName(), outerContext
|
||||
.getBean(KafkaStreamsBinderConfigurationProperties.class));
|
||||
beanFactory.registerSingleton(KafkaStreamsMessageConversionDelegate.class.getSimpleName(), outerContext
|
||||
.getBean(KafkaStreamsMessageConversionDelegate.class));
|
||||
beanFactory.registerSingleton(KafkaStreamsBindingInformationCatalogue.class.getSimpleName(), outerContext
|
||||
.getBean(KafkaStreamsBindingInformationCatalogue.class));
|
||||
beanFactory.registerSingleton(KeyValueSerdeResolver.class.getSimpleName(), outerContext
|
||||
.getBean(KeyValueSerdeResolver.class));
|
||||
beanFactory.registerSingleton(KafkaStreamsExtendedBindingProperties.class.getSimpleName(), outerContext
|
||||
.getBean(KafkaStreamsExtendedBindingProperties.class));
|
||||
};
|
||||
static class KStreamMissingBeansRegistrar extends KafkaStreamsBinderUtils.KafkaStreamsMissingBeansRegistrar {
|
||||
|
||||
private static final String BEAN_NAME = "outerContext";
|
||||
|
||||
@Override
|
||||
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
|
||||
BeanDefinitionRegistry registry) {
|
||||
super.registerBeanDefinitions(importingClassMetadata, registry);
|
||||
|
||||
if (registry.containsBeanDefinition(BEAN_NAME)) {
|
||||
|
||||
AbstractBeanDefinition converstionDelegateBean = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingFactoryBean.class)
|
||||
.addPropertyReference("targetObject", BEAN_NAME)
|
||||
.addPropertyValue("targetMethod", "getBean")
|
||||
.addPropertyValue("arguments", KafkaStreamsMessageConversionDelegate.class)
|
||||
.getBeanDefinition();
|
||||
|
||||
registry.registerBeanDefinition(KafkaStreamsMessageConversionDelegate.class.getSimpleName(), converstionDelegateBean);
|
||||
|
||||
AbstractBeanDefinition keyValueSerdeResolverBean = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingFactoryBean.class)
|
||||
.addPropertyReference("targetObject", BEAN_NAME)
|
||||
.addPropertyValue("targetMethod", "getBean")
|
||||
.addPropertyValue("arguments", KeyValueSerdeResolver.class)
|
||||
.getBeanDefinition();
|
||||
|
||||
registry.registerBeanDefinition(KeyValueSerdeResolver.class.getSimpleName(), keyValueSerdeResolverBean);
|
||||
|
||||
AbstractBeanDefinition kafkaStreamsExtendedBindingPropertiesBean = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingFactoryBean.class)
|
||||
.addPropertyReference("targetObject", BEAN_NAME)
|
||||
.addPropertyValue("targetMethod", "getBean")
|
||||
.addPropertyValue("arguments", KafkaStreamsExtendedBindingProperties.class)
|
||||
.getBeanDefinition();
|
||||
|
||||
registry.registerBeanDefinition(KafkaStreamsExtendedBindingProperties.class.getSimpleName(), kafkaStreamsExtendedBindingPropertiesBean);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -66,7 +66,7 @@ class KTableBinder extends
|
||||
if (!StringUtils.hasText(group)) {
|
||||
group = binderConfigurationProperties.getApplicationId();
|
||||
}
|
||||
KafkaStreamsConsumerBindingUtils.prepareConsumerBinding(name, group, inputTarget,
|
||||
KafkaStreamsBinderUtils.prepareConsumerBinding(name, group, inputTarget,
|
||||
getApplicationContext(),
|
||||
kafkaTopicProvisioner,
|
||||
kafkaStreamsBindingInformationCatalogue,
|
||||
|
||||
@@ -25,12 +25,14 @@ import org.springframework.cloud.stream.binder.kafka.streams.properties.KafkaStr
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
/**
|
||||
* @author Soby Chacko
|
||||
*/
|
||||
@SuppressWarnings("ALL")
|
||||
@Configuration
|
||||
@Import(KafkaStreamsBinderUtils.KafkaStreamsMissingBeansRegistrar.class)
|
||||
public class KTableBinderConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -19,18 +19,24 @@ package org.springframework.cloud.stream.binder.kafka.streams;
|
||||
import org.apache.kafka.streams.StreamsConfig;
|
||||
import org.apache.kafka.streams.errors.DeserializationExceptionHandler;
|
||||
|
||||
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
|
||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||
import org.springframework.cloud.stream.binder.ExtendedConsumerProperties;
|
||||
import org.springframework.cloud.stream.binder.kafka.properties.KafkaConsumerProperties;
|
||||
import org.springframework.cloud.stream.binder.kafka.provisioning.KafkaTopicProvisioner;
|
||||
import org.springframework.cloud.stream.binder.kafka.streams.properties.KafkaStreamsBinderConfigurationProperties;
|
||||
import org.springframework.cloud.stream.binder.kafka.streams.properties.KafkaStreamsConsumerProperties;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
|
||||
import org.springframework.core.type.AnnotationMetadata;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* @author Soby Chacko
|
||||
*/
|
||||
class KafkaStreamsConsumerBindingUtils {
|
||||
class KafkaStreamsBinderUtils {
|
||||
|
||||
static void prepareConsumerBinding(String name, String group, Object inputTarget,
|
||||
ApplicationContext context,
|
||||
@@ -71,4 +77,33 @@ class KafkaStreamsConsumerBindingUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class KafkaStreamsMissingBeansRegistrar implements ImportBeanDefinitionRegistrar {
|
||||
|
||||
private static final String BEAN_NAME = "outerContext";
|
||||
|
||||
@Override
|
||||
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
|
||||
BeanDefinitionRegistry registry) {
|
||||
if (registry.containsBeanDefinition(BEAN_NAME)) {
|
||||
|
||||
AbstractBeanDefinition configBean = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingFactoryBean.class)
|
||||
.addPropertyReference("targetObject", BEAN_NAME)
|
||||
.addPropertyValue("targetMethod", "getBean")
|
||||
.addPropertyValue("arguments", KafkaStreamsBinderConfigurationProperties.class)
|
||||
.getBeanDefinition();
|
||||
|
||||
registry.registerBeanDefinition(KafkaStreamsBinderConfigurationProperties.class.getSimpleName(), configBean);
|
||||
|
||||
AbstractBeanDefinition catalogueBean = BeanDefinitionBuilder.genericBeanDefinition(MethodInvokingFactoryBean.class)
|
||||
.addPropertyReference("targetObject", BEAN_NAME)
|
||||
.addPropertyValue("targetMethod", "getBean")
|
||||
.addPropertyValue("arguments", KafkaStreamsBindingInformationCatalogue.class)
|
||||
.getBeanDefinition();
|
||||
|
||||
registry.registerBeanDefinition(KafkaStreamsBindingInformationCatalogue.class.getSimpleName(), catalogueBean);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user