From d4975d41dd5165d14879f0a09ddd70704f665613 Mon Sep 17 00:00:00 2001 From: ShenFeng312 Date: Thu, 13 Mar 2025 14:53:49 +0800 Subject: [PATCH] AbstractJackson2Decoder#decodeToMono support non-blocking parsing --- .../codec/json/AbstractJackson2Decoder.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java index 23b8b1a37fb7..9e4a20574332 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java @@ -128,6 +128,10 @@ public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType public Flux decode(Publisher input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { + return decodeToFlux(input, elementType, mimeType, hints,null); + } + + private Flux decodeToFlux(Publisher input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints,@Nullable Boolean tokenizeArrays) { ObjectMapper mapper = selectObjectMapper(elementType, mimeType); if (mapper == null) { return Flux.error(new IllegalStateException("No ObjectMapper for " + elementType)); @@ -138,8 +142,10 @@ public Flux decode(Publisher input, ResolvableType elementTy forceUseOfBigDecimal = true; } - boolean tokenizeArrays = (!elementType.isArray() && - !Collection.class.isAssignableFrom(elementType.resolve(Object.class))); + if (tokenizeArrays == null) { + tokenizeArrays = (!elementType.isArray() && + !Collection.class.isAssignableFrom(elementType.resolve(Object.class))); + } Flux processed = processInput(input, elementType, mimeType, hints); Flux tokens = Jackson2Tokenizer.tokenize(processed, mapper.getFactory(), mapper, @@ -188,15 +194,7 @@ protected Flux processInput(Publisher input, ResolvableT @Override public Mono decodeToMono(Publisher input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { - - return Mono.deferContextual(contextView -> { - - Map hintsToUse = contextView.isEmpty() ? hints : - Hints.merge(hints, ContextView.class.getName(), contextView); - - return DataBufferUtils.join(input, this.maxInMemorySize).flatMap(dataBuffer -> - Mono.justOrEmpty(decode(dataBuffer, elementType, mimeType, hintsToUse))); - }); + return decodeToFlux(input, elementType, mimeType, hints, false).singleOrEmpty(); } @Override