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