diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionRegistration.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionRegistration.java index c19e9b1de..4d37f6845 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionRegistration.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionRegistration.java @@ -147,6 +147,7 @@ public class FunctionRegistration implements BeanNameAware { */ @SuppressWarnings({ "unchecked", "rawtypes" }) public FunctionRegistration wrap() { + this.isFunctionSignatureSupported(); FunctionRegistration result; if (this.type == null) { result = (FunctionRegistration) this; @@ -192,4 +193,12 @@ public class FunctionRegistration implements BeanNameAware { } } + private void isFunctionSignatureSupported() { + if (type != null) { + Assert.isTrue(!(Mono.class.isAssignableFrom(this.type.getOutputWrapper()) + && Mono.class.isAssignableFrom(this.type.getInputWrapper())), + "Function is not supported."); + } + } + } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java index 7ca61311a..796262838 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java @@ -35,6 +35,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.AbstractFactoryBean; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; @@ -289,6 +290,11 @@ public class ContextFunctionCatalogAutoConfigurationTests { .isAssignableFrom(Mono.class); } + @Test(expected = BeanCreationException.class) + public void monoToMonoNonVoidFunction() { + create(MonoToMonoNonVoidConfiguration.class); + } + @Test public void messageFunction() { create(MessageConfiguration.class); @@ -867,6 +873,17 @@ public class ContextFunctionCatalogAutoConfigurationTests { } + @EnableAutoConfiguration + @Configuration + protected static class MonoToMonoNonVoidConfiguration { + + @Bean + public Function, Mono> function() { + return mono -> mono; + } + + } + @EnableAutoConfiguration @Configuration protected static class MessageConfiguration {