From e97a55ad54b952c2489d448b6c22664caf3d3330 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Mon, 7 Mar 2016 17:07:12 -0500 Subject: [PATCH] WebClient supports Void response body WebResponseExtractor uses Mono.when with the response status, headers, and the decoded body. However when the response body stream is empty then when completes empty too. This change adds defaultIfEmpty handling for en empty response body. --- .../reactive/WebResponseExtractors.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/spring-web-reactive/src/main/java/org/springframework/web/client/reactive/WebResponseExtractors.java b/spring-web-reactive/src/main/java/org/springframework/web/client/reactive/WebResponseExtractors.java index 9c24c76d35..ac4331b6cb 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/client/reactive/WebResponseExtractors.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/client/reactive/WebResponseExtractors.java @@ -42,6 +42,9 @@ public class WebResponseExtractors { private static final Object[] HINTS = new Object[] {UTF_8}; + private static final Object EMPTY_BODY = new Object(); + + /** * Extract the response body and decode it, returning it as a {@code Mono} */ @@ -68,18 +71,21 @@ public class WebResponseExtractors { * Extract the full response body as a {@code ResponseEntity} * with its body decoded as a single type {@code T} */ - public static WebResponseExtractor>> response(Class sourceClass) { + public static WebResponseExtractor>> response(Class bodyClass) { - ResolvableType resolvableType = ResolvableType.forClass(sourceClass); + ResolvableType bodyType = ResolvableType.forClass(bodyClass); return webResponse -> webResponse.getClientResponse() - .then(response -> - Mono.when( - decodeResponseBody(response, resolvableType, webResponse.getMessageDecoders()).next(), - Mono.just(response.getHeaders()), - Mono.just(response.getStatusCode()))) + .then(response -> { + List> decoders = webResponse.getMessageDecoders(); + return Mono.when( + decodeResponseBody(response, bodyType, decoders).next().defaultIfEmpty(EMPTY_BODY), + Mono.just(response.getHeaders()), + Mono.just(response.getStatusCode())); + }) .map(tuple -> { + Object body = (tuple.getT1() != EMPTY_BODY ? tuple.getT1() : null); //noinspection unchecked - return new ResponseEntity<>((T) tuple.getT1(), tuple.getT2(), tuple.getT3()); + return new ResponseEntity<>((T) body, tuple.getT2(), tuple.getT3()); }); }