diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java index 4d33d8f33..f63c4bf89 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java @@ -35,7 +35,7 @@ import org.springframework.boot.Banner.Mode; import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.stream.config.ListenerContainerCustomizer; -import org.springframework.cloud.stream.config.SpelExpressionConverterConfiguration; +import org.springframework.cloud.stream.config.SpelExpressionConverterConfiguration.SpelConverter; import org.springframework.cloud.stream.reflection.GenericsUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -44,6 +44,7 @@ import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.convert.support.GenericConversionService; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.StandardEnvironment; @@ -254,17 +255,9 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl ? environment.getProperty("spring.jmx.default-domain") : ""; args.add("--spring.jmx.default-domain=" + defaultDomain + "binder." + configurationName); - // Initializing SpringApplicationBuilder with - // SpelExpressionConverterConfiguration due to the fact that - // infrastructure related configuration is not propagated in a multi binder - // scenario. - // See this GH issue for more details: - // https://github.com/spring-cloud/spring-cloud-stream/issues/1412 - // and the associated PR: - // https://github.com/spring-cloud/spring-cloud-stream/pull/1413 + SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder( - SpelExpressionConverterConfiguration.class) - .sources(binderType.getConfigurationClasses()) + binderType.getConfigurationClasses()) .bannerMode(Mode.OFF).logStartupInfo(false) .web(WebApplicationType.NONE); // If the environment is not customized and a main context is available, we @@ -280,7 +273,7 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl springApplicationBuilder.parent(this.context); } else { - this.registerListenerContainerCustomizerInitializerIfNecessary(springApplicationBuilder, context); + this.customizeParentChildContextRelationship(springApplicationBuilder, this.context); springApplicationBuilder.listeners(new ApplicationListener() { @Override public void onApplicationEvent(ApplicationEvent event) { @@ -343,9 +336,10 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl /* * This will propagate/copy ListenerContainerCustomizer(s) from parent context to child context for cases when multiple binders are used. + * It will also register SpelConverter with child context */ @SuppressWarnings({ "unchecked", "rawtypes" }) - private void registerListenerContainerCustomizerInitializerIfNecessary(SpringApplicationBuilder applicationBuilder, ApplicationContext context) { + private void customizeParentChildContextRelationship(SpringApplicationBuilder applicationBuilder, ApplicationContext context) { if (context != null) { Map customizers = context.getBeansOfType(ListenerContainerCustomizer.class); if (!CollectionUtils.isEmpty(customizers)) { @@ -369,6 +363,9 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl ((GenericApplicationContext) childContext).registerBean(customizerEntry.getKey(), ListenerContainerCustomizer.class, () -> customizerWrapper); } + GenericConversionService cs = (GenericConversionService) ((GenericApplicationContext) childContext).getBeanFactory().getConversionService(); + SpelConverter spelConverter = new SpelConverter(); + cs.addConverter(spelConverter); }); } }