From 21d68ff3c8ee260ec6588b997489045de150bd04 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 31 Mar 2020 14:46:22 +0200 Subject: [PATCH] GH-475 Fix support for Flux type conversion At the moment support is rudimentary but given that BeanFactoryAwareFunctionRegistry provides all the necessary type conversion functionality the true fix should consider utilizing it. Resolves #475 --- .../cloud/function/web/RequestProcessor.java | 2 +- .../web/flux/HttpPostIntegrationTests.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java index a4ab3da94..a2a84cdd2 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java @@ -145,7 +145,7 @@ public class RequestProcessor { Type jsonType = body.startsWith("[") && Collection.class.isAssignableFrom(inputType) || body.startsWith("{") ? inputType : Collection.class; - if (body.startsWith("[")) { + if (body.startsWith("[") && itemType instanceof Class) { jsonType = ResolvableType.forClassWithGenerics((Class) jsonType, (Class) itemType).getType(); } diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java index 3cd1db1e9..e44a14dec 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java @@ -351,6 +351,15 @@ public class HttpPostIntegrationTests { String.class).getBody()).isEqualTo("{\"A\":2,\"B\":1}"); } + @Test + public void fluxWithList() throws Exception { + List list = Arrays.asList("A", "B", "A"); + assertThat(this.rest.exchange( + RequestEntity.post(new URI("/fluxCollectionEcho")).accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON).body(list), + String.class).getBody()).isEqualTo("[\"A\",\"B\",\"A\"]"); + } + private String sse(String... values) { return "data:" + StringUtils.arrayToDelimitedString(values, "\n\ndata:") + "\n\n"; } @@ -481,6 +490,11 @@ public class HttpPostIntegrationTests { (map, word) -> map.merge(word, 1, Integer::sum)); } + @Bean + public Function>, Flux> fluxCollectionEcho() { + return flux -> flux.flatMap(v -> Flux.fromIterable(v)); + } + } public static class Foo {