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 cb746825441..2bc2e89b6d1 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 @@ -82,11 +82,7 @@ public class Jackson2JsonDecoder extends Jackson2CodecSupport implements HttpMes public Flux decode(Publisher input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { - Jackson2Tokenizer tokenizer = new Jackson2Tokenizer(nonBlockingParser(), true); - Flux tokens = Flux.from(input) - .flatMap(tokenizer) - .doFinally(t -> tokenizer.endOfInput()); - + Flux tokens = tokenize(input, true); return decodeInternal(tokens, elementType, mimeType, hints); } @@ -94,14 +90,26 @@ public class Jackson2JsonDecoder extends Jackson2CodecSupport implements HttpMes public Mono decodeToMono(Publisher input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { - Jackson2Tokenizer tokenizer = new Jackson2Tokenizer(nonBlockingParser(), false); - Flux tokens = Flux.from(input) - .flatMap(tokenizer) - .doFinally(t -> tokenizer.endOfInput()); - + Flux tokens = tokenize(input, false); return decodeInternal(tokens, elementType, mimeType, hints).singleOrEmpty(); } + private Flux tokenize(Publisher input, boolean tokenizeArrayElements) { + try { + JsonFactory factory = objectMapper().getFactory(); + JsonParser nonBlockingParser = factory.createNonBlockingByteArrayParser(); + Jackson2Tokenizer tokenizer = new Jackson2Tokenizer(nonBlockingParser, + tokenizeArrayElements); + return Flux.from(input) + .flatMap(tokenizer) + .doFinally(t -> tokenizer.endOfInput()); + } + catch (IOException ex) { + return Flux.error(new UncheckedIOException(ex)); + } + + } + private Flux decodeInternal(Flux tokens, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { @@ -118,19 +126,18 @@ public class Jackson2JsonDecoder extends Jackson2CodecSupport implements HttpMes objectMapper().readerWithView(jsonView).forType(javaType) : objectMapper().readerFor(javaType)); - return tokens.flatMap(tokenBuffer -> { + return tokens.map(tokenBuffer -> { try { - Object value = reader.readValue(tokenBuffer.asParser()); - return Mono.just(value); + return reader.readValue(tokenBuffer.asParser()); } catch (InvalidDefinitionException ex) { - return Mono.error(new CodecException("Type definition error: " + ex.getType(), ex)); + throw new CodecException("Type definition error: " + ex.getType(), ex); } catch (JsonProcessingException ex) { - return Mono.error(new DecodingException("JSON decoding error: " + ex.getOriginalMessage(), ex)); + throw new DecodingException("JSON decoding error: " + ex.getOriginalMessage(), ex); } catch (IOException ex) { - return Mono.error(new DecodingException("I/O error while parsing input stream", ex)); + throw new DecodingException("I/O error while parsing input stream", ex); } }); } @@ -150,13 +157,4 @@ public class Jackson2JsonDecoder extends Jackson2CodecSupport implements HttpMes return parameter.getParameterAnnotation(annotType); } - private JsonParser nonBlockingParser() { - try { - JsonFactory factory = this.objectMapper().getFactory(); - return factory.createNonBlockingByteArrayParser(); - } - catch (IOException ex) { - throw new UncheckedIOException(ex); - } - } }