diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/function/FunctionConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/function/FunctionConfiguration.java index 377f2bf08..dd6163fbd 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/function/FunctionConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/function/FunctionConfiguration.java @@ -43,11 +43,13 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.function.context.FunctionCatalog; import org.springframework.cloud.function.context.FunctionProperties; +import org.springframework.cloud.function.context.FunctionRegistry; import org.springframework.cloud.function.context.PollableBean; import org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry.FunctionInvocationWrapper; import org.springframework.cloud.function.context.catalog.FunctionInspector; @@ -105,9 +107,10 @@ import org.springframework.util.StringUtils; */ @Configuration @EnableConfigurationProperties(StreamFunctionProperties.class) -@AutoConfigureBefore(BindingServiceConfiguration.class) @Import({ BindingBeansRegistrar.class, BinderFactoryAutoConfiguration.class }) -@ConditionalOnClass(ContextFunctionCatalogAutoConfiguration.class) +@AutoConfigureBefore(BindingServiceConfiguration.class) +@AutoConfigureAfter(ContextFunctionCatalogAutoConfiguration.class) +@ConditionalOnBean(FunctionRegistry.class) public class FunctionConfiguration { @Bean diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/ImplicitFunctionBindingTests.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/ImplicitFunctionBindingTests.java index d9801d024..19179e44d 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/ImplicitFunctionBindingTests.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/ImplicitFunctionBindingTests.java @@ -28,6 +28,7 @@ import reactor.core.publisher.Flux; import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.annotation.StreamListener; import org.springframework.cloud.stream.binder.test.InputDestination; @@ -332,6 +333,26 @@ public class ImplicitFunctionBindingTests { } } + + @Test + public void testNoFunctionEnabledConfiguration() { + System.clearProperty("spring.cloud.stream.function.definition"); + try (ConfigurableApplicationContext context = new SpringApplicationBuilder( + TestChannelBinderConfiguration.getCompleteConfiguration(NoFunctionEnabledConfiguration.class)) + .web(WebApplicationType.NONE).run("--spring.jmx.enabled=false")) { + + try { + context.getBean(FunctionConfiguration.class); + fail(); + } + catch (Exception e) { + // ignore + } + + } + } + + @EnableAutoConfiguration public static class NoEnableBindingConfiguration { @@ -447,4 +468,13 @@ public class ImplicitFunctionBindingTests { } } + @EnableAutoConfiguration(exclude = ContextFunctionCatalogAutoConfiguration.class) + public static class NoFunctionEnabledConfiguration { + + @Bean + public Supplier supplier() { + return () -> "hello"; + } + } + }