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
This commit is contained in:
Brian Clozel
2016-08-23 16:10:41 +02:00
parent 93d2287894
commit e4575330c3
2 changed files with 13 additions and 1 deletions

View File

@@ -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<Object> decodeInternal(JsonObjectDecoder objectDecoder, Publisher<DataBuffer> inputStream,

View File

@@ -105,6 +105,18 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa
});
}
@Test
public void decodeEmptyBodyToMono() throws Exception {
Flux<DataBuffer> source = Flux.empty();
ResolvableType elementType = ResolvableType.forClass(Pojo.class);
Mono<Object> flux = new Jackson2JsonDecoder().decodeToMono(source, elementType, null);
TestSubscriber.subscribe(flux)
.assertNoError()
.assertComplete()
.assertValueCount(0);
}
void handle(List<Pojo> list) {
}