From 8b9051dfebc4be8ba1eb265d639a838a8c645c05 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 9 Apr 2021 12:24:53 +0200 Subject: [PATCH] GH-608 Fix support for Message payload conversion Resolves #608 --- .../catalog/SimpleFunctionRegistry.java | 25 +++++++++++---- ...BeanFactoryAwareFunctionRegistryTests.java | 32 +++++++++++++++++++ 2 files changed, 51 insertions(+), 6 deletions(-) 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 {