Skip to content

Commit 92bb76f

Browse files
committed
Disable Jackson's buffer recyling feature for WebFlux
Issue: SPR-17193
1 parent 4b6a5fb commit 92bb76f

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -55,11 +55,20 @@
5555
*/
5656
public abstract class AbstractJackson2Decoder extends Jackson2CodecSupport implements HttpMessageDecoder<Object> {
5757

58+
/**
59+
* Until https://github.com/FasterXML/jackson-core/issues/476 is resolved,
60+
* we need to ensure buffer recycling is off.
61+
*/
62+
private final JsonFactory jsonFactory;
63+
64+
5865
/**
5966
* Constructor with a Jackson {@link ObjectMapper} to use.
6067
*/
6168
protected AbstractJackson2Decoder(ObjectMapper mapper, MimeType... mimeTypes) {
6269
super(mapper, mimeTypes);
70+
this.jsonFactory = mapper.getFactory().copy()
71+
.disable(JsonFactory.Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING);
6372
}
6473

6574

@@ -75,24 +84,18 @@ public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType
7584
public Flux<Object> decode(Publisher<DataBuffer> input, ResolvableType elementType,
7685
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
7786

78-
Flux<TokenBuffer> tokens = tokenize(input, true);
87+
Flux<TokenBuffer> tokens = Jackson2Tokenizer.tokenize(Flux.from(input), this.jsonFactory, true);
7988
return decodeInternal(tokens, elementType, mimeType, hints);
8089
}
8190

8291
@Override
8392
public Mono<Object> decodeToMono(Publisher<DataBuffer> input, ResolvableType elementType,
8493
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
8594

86-
Flux<TokenBuffer> tokens = tokenize(input, false);
95+
Flux<TokenBuffer> tokens = Jackson2Tokenizer.tokenize(Flux.from(input), this.jsonFactory, false);
8796
return decodeInternal(tokens, elementType, mimeType, hints).singleOrEmpty();
8897
}
8998

90-
private Flux<TokenBuffer> tokenize(Publisher<DataBuffer> input, boolean tokenizeArrayElements) {
91-
Flux<DataBuffer> inputFlux = Flux.from(input);
92-
JsonFactory factory = getObjectMapper().getFactory();
93-
return Jackson2Tokenizer.tokenize(inputFlux, factory, tokenizeArrayElements);
94-
}
95-
9699
private Flux<Object> decodeInternal(Flux<TokenBuffer> tokens, ResolvableType elementType,
97100
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
98101

0 commit comments

Comments
 (0)