diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java index 95223a44b..28a05ff21 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java @@ -821,12 +821,15 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect boolean convertWithHint = false; Type hint = FunctionTypeUtils.getGenericType(type); - if (FunctionTypeUtils.isTypeCollection(type)) { - convertWithHint = true; - } - else if (!FunctionTypeUtils.isPublisher(type) && !rawType.equals(type)) { - convertWithHint = true; - } + + convertWithHint = this.useConversionHint(type, rawType); + +// if (FunctionTypeUtils.isTypeCollection(type)) { +// convertWithHint = true; +// } +// else if (!FunctionTypeUtils.isPublisher(type) && !rawType.equals(type) && !FunctionTypeUtils.isMessage(type)) { +// convertWithHint = true; +// } convertedValue = convertWithHint ? this.fromMessage((Message) value, (Class) rawType, hint) @@ -864,6 +867,16 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect return convertedValue; } + private boolean useConversionHint(Type type, Type rawType) { + if (FunctionTypeUtils.isTypeCollection(type)) { + return true; + } + else if (!FunctionTypeUtils.isPublisher(type) && !rawType.equals(type) && !FunctionTypeUtils.isMessage(type)) { + return true; + } + return false; + } + private Object convertNonMessageInputIfNecessary(Type inputType, Object input) { Object convertedInput = input; Class rawInputType = FunctionTypeUtils.isReactive(inputType) || FunctionTypeUtils.isMessage(inputType) diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java index fce467ca8..d7a55f242 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java @@ -546,6 +546,23 @@ public class BeanFactoryAwareFunctionRegistryTests { assertThat(((Person) config.consumerInputRef.get()).getName()).isEqualTo("Ricky"); } + @Test + public void testGH_608_B() { + ApplicationContext context = new SpringApplicationBuilder(MessageFunctionConfiguration.class) + .run("--logging.level.org.springframework.cloud.function=DEBUG", + "--spring.main.lazy-initialization=true"); + FunctionCatalog catalog = context.getBean(FunctionCatalog.class); + + String productJson = "{\"name\":\"bike\"}"; + FunctionInvocationWrapper function = catalog.lookup("echo", "application/json"); + Message result = (Message) function.apply(productJson); + assertThat(productJson).isEqualTo(new String(result.getPayload())); + + function = catalog.lookup("echoFlux", "application/json"); + result = ((Flux>) function.apply("{\"name\":\"bike\"}")).blockFirst(); + assertThat(productJson).isEqualTo(new String(result.getPayload())); + } + @Test public void testGH_609() { FunctionCatalog catalog = this.configureCatalog(SampleFunctionConfiguration.class); @@ -803,6 +820,21 @@ public class BeanFactoryAwareFunctionRegistryTests { } } + @EnableAutoConfiguration + @Configuration + protected static class MessageFunctionConfiguration { + + @Bean + public Function, Message> echo() { + return x -> x; + } + + @Bean + public Function>, Flux>> echoFlux() { + return x -> x; + } + } + @EnableAutoConfiguration @Configuration protected static class SampleFunctionConfiguration {