diff --git a/docs/src/main/asciidoc/spring-cloud-stream.adoc b/docs/src/main/asciidoc/spring-cloud-stream.adoc index b0ac8c12a..b500705ba 100644 --- a/docs/src/main/asciidoc/spring-cloud-stream.adoc +++ b/docs/src/main/asciidoc/spring-cloud-stream.adoc @@ -591,7 +591,7 @@ Since Spring Cloud Stream v2.1, another alternative for defining _stream handler support for https://cloud.spring.io/spring-cloud-function/[Spring Cloud Function] where they can be expressed as beans of type `java.util.function.[Supplier/Function/Consumer]`. -To specify which functional bean to bind to the external destination(s) exposed by the bindings, you must provide `spring.cloud.stream.function.definition` property. +To specify which functional bean to bind to the external destination(s) exposed by the bindings, you must provide `spring.cloud.stream.function.definition` or native to spring-cloud-function `spring.cloud.function.definition` property. Here is the example of the Processor application exposing message handler as `java.util.function.Function` [source,java] @@ -601,7 +601,7 @@ Here is the example of the Processor application exposing message handler as `ja public class MyFunctionBootApp { public static void main(String[] args) { - SpringApplication.run(MyFunctionBootApp.class, "--spring.cloud.stream.function.definition=toUpperCase"); + SpringApplication.run(MyFunctionBootApp.class, "--spring.cloud.function.definition=toUpperCase"); } @Bean diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java index 6df32d2b1..8f3636396 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java @@ -288,6 +288,9 @@ public class BinderFactoryAutoConfiguration { private String determineFunctionName(FunctionCatalog catalog, Environment environment) { String name = environment.getProperty("spring.cloud.stream.function.definition"); + if (!StringUtils.hasText(name)) { + name = environment.getProperty("spring.cloud.function.definition"); + } if (!StringUtils.hasText(name) && Boolean.parseBoolean( environment.getProperty("spring.cloud.function.routing.enabled", "false"))) { name = RoutingFunction.FUNCTION_NAME; 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 5f3715ef2..ad00df93f 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 @@ -19,6 +19,7 @@ package org.springframework.cloud.stream.function; import java.util.function.Consumer; import java.util.function.Function; +import org.junit.After; import org.junit.Test; import reactor.core.publisher.Flux; @@ -46,6 +47,12 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class ImplicitFunctionBindingTests { + @After + public void after() { + System.clearProperty("spring.cloud.stream.function.definition"); + System.clearProperty("spring.cloud.function.definition"); + } + @Test public void testBindingWithNoEnableBindingConfiguration() { @@ -70,6 +77,30 @@ public class ImplicitFunctionBindingTests { } } + @Test + public void testBindingWithNoEnableBindingConfigurationWithFunctionNativeDefinitionProperty() { + + try (ConfigurableApplicationContext context = new SpringApplicationBuilder( + TestChannelBinderConfiguration.getCompleteConfiguration( + NoEnableBindingConfiguration.class)) + .web(WebApplicationType.NONE) + .run("--spring.jmx.enabled=false", + "--spring.cloud.function.definition=func")) { + + InputDestination inputDestination = context.getBean(InputDestination.class); + OutputDestination outputDestination = context + .getBean(OutputDestination.class); + + Message inputMessage = MessageBuilder + .withPayload("Hello".getBytes()).build(); + inputDestination.send(inputMessage); + + Message outputMessage = outputDestination.receive(); + assertThat(outputMessage.getPayload()).isEqualTo("Hello".getBytes()); + + } + } + @Test public void testBindingWithEnableBindingConfiguration() {