diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java index be0b9264e..4b1db374d 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java @@ -31,6 +31,7 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Stream; +import com.fasterxml.jackson.databind.JsonNode; import net.jodah.typetools.TypeResolver; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -52,6 +53,8 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; + + /** * Set of utility operations to interrogate function definitions. * @@ -82,13 +85,17 @@ public final class FunctionTypeUtils { } type = getGenericType(type); Class rawType = type instanceof ParameterizedType ? getRawType(type) : (Class) type; - return Collection.class.isAssignableFrom(rawType); + return Collection.class.isAssignableFrom(rawType) || JsonNode.class.isAssignableFrom(rawType); } public static boolean isTypeArray(Type type) { return getRawType(type).isArray(); } + public static boolean isJsonNode(Type type) { + return getRawType(type).isArray(); + } + /** * A convenience method identical to {@link #getImmediateGenericType(Type, int)} * for cases when provided 'type' is {@link Publisher} or {@link Message}. 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 c5c7344d9..f3bb17dec 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 @@ -39,6 +39,7 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; +import com.fasterxml.jackson.databind.JsonNode; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; @@ -104,6 +105,15 @@ public class BeanFactoryAwareFunctionRegistryTests { System.clearProperty("spring.cloud.function.definition"); } + @Test + public void testJsonNodeAsInput() throws Exception { + FunctionCatalog catalog = this.configureCatalog(JsonNodeConfiguration.class); + Function, Message> f = catalog.lookup("messageAsJsonNode", "application/json"); + Message m = MessageBuilder.withPayload("[{\"name\":\"bob\"}, {\"name\":\"bob\"}]").setHeader(MessageHeaders.CONTENT_TYPE, "application/json").build(); + assertThat(new String(f.apply(m).getPayload())).isEqualTo("[{\"name\":\"bob\"},{\"name\":\"bob\"}]"); + f = catalog.lookup("asJsonNode", "application/json"); + assertThat(new String(f.apply(m).getPayload())).isEqualTo("[{\"name\":\"bob\"},{\"name\":\"bob\"}]"); + } @SuppressWarnings({ "rawtypes" }) @Test @@ -782,6 +792,24 @@ public class BeanFactoryAwareFunctionRegistryTests { } } + @EnableAutoConfiguration + @Configuration + public static class JsonNodeConfiguration { + @Bean + public Function, String> messageAsJsonNode() { + return v -> { + return v.getPayload().toString(); + }; + } + + @Bean + public Function asJsonNode() { + return v -> { + return v.toString(); + }; + } + } + @EnableAutoConfiguration public static class EmptyConfiguration {