From e9441b50d3f7e9a196d0e0d692793155f7711552 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 7 Apr 2021 11:50:09 +0200 Subject: [PATCH] GH-679 Fix output conversion for composed functions --- .../catalog/SimpleFunctionRegistry.java | 6 +++--- ...BeanFactoryAwareFunctionRegistryTests.java | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 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 9733b2a01..95223a44b 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 @@ -277,7 +277,7 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect return null; } Function resultFunction = null; - if (this.registrationsByName.containsKey(definition)) { + if (this.registrationsByName.containsKey(definition) && ObjectUtils.isEmpty(acceptedOutputTypes)) { Object targetFunction = this.registrationsByName.get(definition).getTarget(); Type functionType = this.registrationsByName.get(definition).getType().getType(); if (targetFunction instanceof FunctionInvocationWrapper) { @@ -343,7 +343,7 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect registrationsByName.putIfAbsent(name, registration); } - function = new FunctionInvocationWrapper(function, currentFunctionType, name, names.length > 1 ? new String[] {} : acceptedOutputTypes); + function = new FunctionInvocationWrapper(function, currentFunctionType, name, !names[0].equals("origin") && name.equals(names[names.length - 1]) ? acceptedOutputTypes : new String[] {}); if (originFunctionType == null) { originFunctionType = currentFunctionType; @@ -723,7 +723,7 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect } if (convertedValue == null) { - throw new MessageConversionException(COULD_NOT_CONVERT_OUTPUT); + convertedValue = value; } return convertedValue; } 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 c7040996d..fce467ca8 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 @@ -244,6 +244,25 @@ public class BeanFactoryAwareFunctionRegistryTests { assertThat(function.apply("foo")).isEqualTo("OOF"); } + @Test + public void testCompositionWithOutputConversion() { + FunctionCatalog catalog = this.configureCatalog(); + Function, Flux>> fluxFunction = catalog.lookup("uppercase|reverseFlux", "application/json"); + List> result = fluxFunction.apply(Flux.just("hello", "bye")).collectList().block(); + assertThat(result.get(0).getPayload()).isEqualTo("\"OLLEH\"".getBytes()); + assertThat(result.get(1).getPayload()).isEqualTo("\"EYB\"".getBytes()); + + fluxFunction = catalog.lookup("uppercase|reverse|reverseFlux", "application/json"); + result = fluxFunction.apply(Flux.just("hello", "bye")).collectList().block(); + assertThat(result.get(0).getPayload()).isEqualTo("\"HELLO\"".getBytes()); + assertThat(result.get(1).getPayload()).isEqualTo("\"BYE\"".getBytes()); + + fluxFunction = catalog.lookup("uppercase|reverseFlux|reverse", "application/json"); + result = fluxFunction.apply(Flux.just("hello", "bye")).collectList().block(); + assertThat(result.get(0).getPayload()).isEqualTo("\"HELLO\"".getBytes()); + assertThat(result.get(1).getPayload()).isEqualTo("\"BYE\"".getBytes()); + } + @Test public void testCompositionSupplierAndFunction() { FunctionCatalog catalog = this.configureCatalog();