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 6457c8038..af9b64969 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 @@ -761,6 +761,10 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect if (rawType instanceof ParameterizedType) { rawType = ((ParameterizedType) rawType).getRawType(); } + if (value != null && !(value instanceof Message) && FunctionTypeUtils.isMessage(type)) { + value = new GenericMessage<>(value); + convertedValue = value; + } if (value instanceof Message) { // see AWS adapter with Optional payload if (messageNeedsConversion(rawType, (Message) value)) { convertedValue = FunctionTypeUtils.isTypeCollection(type) 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 3973f945c..0e84a0975 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 @@ -471,6 +471,40 @@ public class BeanFactoryAwareFunctionRegistryTests { registry.register(e); } + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Test + public void testValueWrappedInMessageIfNecessary() { + FunctionCatalog catalog = this.configureCatalog(PojoToMessageFunctionCompositionConfiguration.class); + Function f = catalog.lookup("uppercase|echo"); + assertThat(f.apply("hello")).isEqualTo("HELLO"); + f = catalog.lookup("toJson|uppercasePerson"); + assertThat(f.apply("Bubbles")).isEqualTo("BUBBLES"); + } + + @EnableAutoConfiguration + public static class PojoToMessageFunctionCompositionConfiguration { + + @Bean + public Function uppercase() { + return v -> v.toUpperCase(); + } + + @Bean + public Function, String> echo() { + return v -> v.getPayload(); + } + + @Bean + public Function toJson() { + return v -> "{\"id\":1, \"name\":\"" + v + "\"}"; + } + + @Bean + public Function, String> uppercasePerson() { + return v -> v.getPayload().getName().toUpperCase(); + } + } + @EnableAutoConfiguration public static class EmptyConfiguration { diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java index 86ad43b40..788a8316e 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java @@ -91,7 +91,7 @@ public class SimpleFunctionRegistryTests { catalog.register(registration); FunctionInvocationWrapper lookedUpFunction = catalog.lookup("hello"); - assertThat(lookedUpFunction).isNotNull(); // becouse we only have one and can look it up with any name + assertThat(lookedUpFunction).isNotNull(); // because we only have one and can look it up with any name FunctionRegistration registration2 = new FunctionRegistration<>( function, "foo2").type(FunctionType.of(TestFunction.class)); catalog.register(registration2);