From e4575330c375c68a9a9e4c650ac381919e4d3c81 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 23 Aug 2016 16:10:41 +0200 Subject: [PATCH] Support empty body in Jackson2JsonDecoder.decodeToMono Prior to this commit, extracting an HTTP response with an empty body and no Content-Type header using the WebClient would: * trigger the use of the Jackson2JsonDecoder * throw a NoSuchElementException because of the use of `Flux.single()` This commit changes this behavior to `Flux.singleOrEmpty()` to avoid throwing exceptions for empty Flux instances. Issue: SPR-14582 --- .../http/codec/json/Jackson2JsonDecoder.java | 2 +- .../http/codec/json/Jackson2JsonDecoderTests.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonDecoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonDecoder.java index 41034272713..a941b3efdc0 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonDecoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonDecoder.java @@ -87,7 +87,7 @@ public class Jackson2JsonDecoder extends AbstractJackson2Codec implements Decode MimeType mimeType, Object... hints) { JsonObjectDecoder objectDecoder = this.monoObjectDecoder; - return decodeInternal(objectDecoder, inputStream, elementType, mimeType, hints).single(); + return decodeInternal(objectDecoder, inputStream, elementType, mimeType, hints).singleOrEmpty(); } private Flux decodeInternal(JsonObjectDecoder objectDecoder, Publisher inputStream, diff --git a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java index b68c512ef03..15729456d72 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java @@ -105,6 +105,18 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa }); } + @Test + public void decodeEmptyBodyToMono() throws Exception { + Flux source = Flux.empty(); + ResolvableType elementType = ResolvableType.forClass(Pojo.class); + Mono flux = new Jackson2JsonDecoder().decodeToMono(source, elementType, null); + + TestSubscriber.subscribe(flux) + .assertNoError() + .assertComplete() + .assertValueCount(0); + } + void handle(List list) { }