diff --git a/spring-cloud-function-samples/function-sample-pojo/pom.xml b/spring-cloud-function-samples/function-sample-pojo/pom.xml index 7c7c5575d..d621f201e 100644 --- a/spring-cloud-function-samples/function-sample-pojo/pom.xml +++ b/spring-cloud-function-samples/function-sample-pojo/pom.xml @@ -13,20 +13,20 @@ org.springframework.boot spring-boot-starter-parent - 2.1.0.M1 + 2.1.0.RC1 1.8 2.0.0.BUILD-SNAPSHOT - 1.0.13.RELEASE + 1.0.17.RELEASE org.springframework.cloud - spring-cloud-starter-function-web + spring-cloud-starter-function-webflux org.springframework.boot 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 edb5a89f9..1ca0065ae 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 @@ -107,9 +107,9 @@ public class RequestProcessor { if (body.startsWith("[")) { input = Collection.class.isAssignableFrom(inputType) ? mapper.toObject(body, inputType) - : mapper.toObject(body, ResolvableType - .forClassWithGenerics(ArrayList.class, (Class) inputType) - .getType()); + : mapper.toObject(body, + ResolvableType.forClassWithGenerics(ArrayList.class, + (Class) inputType).getType()); } else { if (inputType == String.class) { @@ -126,8 +126,7 @@ public class RequestProcessor { } } } - return post(wrapper, input, null, stream, - !Collection.class.isAssignableFrom(inputType)); + return post(wrapper, input, null, stream); } public Mono> stream(FunctionWrapper request) { @@ -138,8 +137,7 @@ public class RequestProcessor { } private Mono> post(FunctionWrapper wrapper, Object body, - MultiValueMap params, boolean stream, - boolean shouldFluxAsIterable) { + MultiValueMap params, boolean stream) { Iterable iterable = body instanceof Collection ? (List) body : Collections.singletonList(body); @@ -152,8 +150,10 @@ public class RequestProcessor { form.putAll(params); } + boolean inputIsCollection = + Collection.class.isAssignableFrom(inspector.getInputType(wrapper.handler())); Flux flux = body == null ? Flux.just(form) - : shouldFluxAsIterable ? Flux.fromIterable(iterable) : Flux.just(body); + : inputIsCollection ? Flux.just(body) : Flux.fromIterable(iterable); if (inspector.isMessage(function)) { flux = messages(wrapper, function == null ? consumer : function, flux); } @@ -229,6 +229,9 @@ public class RequestProcessor { } private boolean isInputMultiple(Object handler) { + if (handler instanceof FluxWrapper) { + handler = ((FluxWrapper) handler).getTarget(); + } Class type = inspector.getInputType(handler); Class wrapper = inspector.getInputWrapper(handler); return Collection.class.isAssignableFrom(type) || Flux.class.equals(wrapper); diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/test/PojoTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/test/PojoTests.java index 9e222a065..9dba47810 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/test/PojoTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/test/PojoTests.java @@ -44,11 +44,17 @@ public class PojoTests { private WebTestClient client; @Test - public void words() throws Exception { + public void single() throws Exception { client.post().uri("/").body(Mono.just("{\"value\":\"foo\"}"), String.class).exchange() .expectStatus().isOk().expectBody(String.class).isEqualTo("{\"value\":\"FOO\"}"); } + @Test + public void multiple() throws Exception { + client.post().uri("/").body(Mono.just("[{\"value\":\"foo\"},{\"value\":\"bar\"}]"), String.class).exchange() + .expectStatus().isOk().expectBody(String.class).isEqualTo("[{\"value\":\"FOO\"},{\"value\":\"BAR\"}]"); + } + @SpringBootConfiguration protected static class TestConfiguration implements Function { @Override