Skip to content

Commit eb97169

Browse files
committed
Merge branch '5.1.x'
2 parents 604361e + 2835424 commit eb97169

File tree

3 files changed

+19
-16
lines changed

3 files changed

+19
-16
lines changed

spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public Flux<Object> decode(Publisher<DataBuffer> input, ResolvableType elementTy
8787
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
8888

8989
Flux<TokenBuffer> tokens = Jackson2Tokenizer.tokenize(
90-
Flux.from(input), this.jsonFactory, getObjectMapper().getDeserializationContext(), true);
90+
Flux.from(input), this.jsonFactory, getObjectMapper(), true);
9191
return decodeInternal(tokens, elementType, mimeType, hints);
9292
}
9393

@@ -96,7 +96,7 @@ public Mono<Object> decodeToMono(Publisher<DataBuffer> input, ResolvableType ele
9696
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
9797

9898
Flux<TokenBuffer> tokens = Jackson2Tokenizer.tokenize(
99-
Flux.from(input), this.jsonFactory, getObjectMapper().getDeserializationContext(), false);
99+
Flux.from(input), this.jsonFactory, getObjectMapper(), false);
100100
return decodeInternal(tokens, elementType, mimeType, hints).singleOrEmpty();
101101
}
102102

spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import com.fasterxml.jackson.core.JsonToken;
2828
import com.fasterxml.jackson.core.async.ByteArrayFeeder;
2929
import com.fasterxml.jackson.databind.DeserializationContext;
30+
import com.fasterxml.jackson.databind.ObjectMapper;
31+
import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext;
3032
import com.fasterxml.jackson.databind.util.TokenBuffer;
3133
import reactor.core.Exceptions;
3234
import reactor.core.publisher.Flux;
@@ -177,16 +179,22 @@ private boolean isTopLevelArrayToken(JsonToken token) {
177179
* Tokenize the given {@code Flux<DataBuffer>} into {@code Flux<TokenBuffer>}.
178180
* @param dataBuffers the source data buffers
179181
* @param jsonFactory the factory to use
182+
* @param objectMapper the current mapper instance
180183
* @param tokenizeArrayElements if {@code true} and the "top level" JSON object is
181184
* an array, each element is returned individually immediately after it is received
182185
* @return the resulting token buffers
183186
*/
184187
public static Flux<TokenBuffer> tokenize(Flux<DataBuffer> dataBuffers, JsonFactory jsonFactory,
185-
DeserializationContext deserializationContext, boolean tokenizeArrayElements) {
188+
ObjectMapper objectMapper, boolean tokenizeArrayElements) {
186189

187190
try {
188191
JsonParser parser = jsonFactory.createNonBlockingByteArrayParser();
189-
Jackson2Tokenizer tokenizer = new Jackson2Tokenizer(parser, deserializationContext, tokenizeArrayElements);
192+
DeserializationContext context = objectMapper.getDeserializationContext();
193+
if (context instanceof DefaultDeserializationContext) {
194+
context = ((DefaultDeserializationContext) context).createInstance(
195+
objectMapper.getDeserializationConfig(), parser, objectMapper.getInjectableValues());
196+
}
197+
Jackson2Tokenizer tokenizer = new Jackson2Tokenizer(parser, context, tokenizeArrayElements);
190198
return dataBuffers.concatMapIterable(tokenizer::tokenize).concatWith(tokenizer.endOfInput());
191199
}
192200
catch (IOException ex) {

spring-web/src/test/java/org/springframework/http/codec/json/Jackson2TokenizerTests.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -184,22 +184,18 @@ public void tokenizeArrayElements() {
184184
@Test
185185
public void errorInStream() {
186186
DataBuffer buffer = stringBuffer("{\"id\":1,\"name\":");
187-
Flux<DataBuffer> source = Flux.just(buffer)
188-
.concatWith(Flux.error(new RuntimeException()));
189-
190-
Flux<TokenBuffer> result = Jackson2Tokenizer.tokenize(
191-
source, this.jsonFactory, this.objectMapper.getDeserializationContext(), true);
187+
Flux<DataBuffer> source = Flux.just(buffer).concatWith(Flux.error(new RuntimeException()));
188+
Flux<TokenBuffer> result = Jackson2Tokenizer.tokenize(source, this.jsonFactory, this.objectMapper, true);
192189

193190
StepVerifier.create(result)
194191
.expectError(RuntimeException.class)
195192
.verify();
196193
}
197194

198-
@Test // SPR-16521
195+
@Test // SPR-16521
199196
public void jsonEOFExceptionIsWrappedAsDecodingError() {
200197
Flux<DataBuffer> source = Flux.just(stringBuffer("{\"status\": \"noClosingQuote}"));
201-
Flux<TokenBuffer> tokens = Jackson2Tokenizer.tokenize(
202-
source, this.jsonFactory, this.objectMapper.getDeserializationContext(), false);
198+
Flux<TokenBuffer> tokens = Jackson2Tokenizer.tokenize(source, this.jsonFactory, this.objectMapper, false);
203199

204200
StepVerifier.create(tokens)
205201
.expectError(DecodingException.class)
@@ -208,12 +204,11 @@ public void jsonEOFExceptionIsWrappedAsDecodingError() {
208204

209205

210206
private void testTokenize(List<String> source, List<String> expected, boolean tokenizeArrayElements) {
211-
Flux<TokenBuffer> tokenBufferFlux = Jackson2Tokenizer.tokenize(
207+
Flux<TokenBuffer> tokens = Jackson2Tokenizer.tokenize(
212208
Flux.fromIterable(source).map(this::stringBuffer),
213-
this.jsonFactory, this.objectMapper.getDeserializationContext(),
214-
tokenizeArrayElements);
209+
this.jsonFactory, this.objectMapper, tokenizeArrayElements);
215210

216-
Flux<String> result = tokenBufferFlux
211+
Flux<String> result = tokens
217212
.map(tokenBuffer -> {
218213
try {
219214
TreeNode root = this.objectMapper.readTree(tokenBuffer.asParser());

0 commit comments

Comments
 (0)