GH-489 the received data which Post Flux data to FunctionController is not same as the function apply

fix test case
This commit is contained in:
谭繁华
2020-04-09 09:31:51 +08:00
committed by Oleg Zhurakousky
parent 29dc59bb7e
commit 719f3745f0
5 changed files with 77 additions and 10 deletions

View File

@@ -206,7 +206,7 @@ public class RequestProcessor {
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private Mono<ResponseEntity<?>> response(FunctionWrapper wrapper, Object body,
public Mono<ResponseEntity<?>> response(FunctionWrapper wrapper, Object body,
boolean stream) {
Function function = wrapper.function();
@@ -215,8 +215,9 @@ public class RequestProcessor {
if (Collection.class
.isAssignableFrom(this.inspector.getInputType(wrapper.handler()))) {
flux = Flux.just(body);
}
else {
} else if (body instanceof Flux) {
flux = Flux.from((Flux) body);
} else {
Iterable<?> iterable = body instanceof Collection ? (Collection<?>) body
: (body instanceof Set ? Collections.singleton(body)
: Collections.singletonList(body));

View File

@@ -21,6 +21,7 @@ import java.util.function.Function;
import java.util.function.Supplier;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.cloud.function.web.RequestProcessor;
@@ -100,9 +101,9 @@ public class FunctionController {
@PostMapping(path = "/**", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@ResponseBody
public Mono<ResponseEntity<?>> postStream(ServerWebExchange request,
@RequestBody(required = false) String body) {
FunctionWrapper wrapper = wrapper(request);
return this.processor.post(wrapper, body, true);
@RequestBody(required = false) Flux<String> body) {
final FunctionWrapper wrapper = wrapper(request);
return this.processor.response(wrapper, body, true);
}
@GetMapping(path = "/**")

View File

@@ -308,8 +308,7 @@ public class HttpPostIntegrationTests {
@Test
public void uppercaseSSE() throws Exception {
assertThat(this.rest.exchange(RequestEntity.post(new URI("/uppercase"))
.accept(EVENT_STREAM).contentType(MediaType.APPLICATION_JSON)
assertThat(this.rest.exchange(RequestEntity.post(new URI("/uppercase")).contentType(MediaType.APPLICATION_JSON)
.body("[\"foo\",\"bar\"]"), String.class).getBody())
.isEqualTo(sse("(FOO)", "(BAR)"));
}
@@ -361,7 +360,7 @@ public class HttpPostIntegrationTests {
}
private String sse(String... values) {
return "data:" + StringUtils.arrayToDelimitedString(values, "\n\ndata:") + "\n\n";
return "[\"" + StringUtils.arrayToDelimitedString(values, "\",\"") + "\"]";
}
@EnableAutoConfiguration