Skip to content

Commit 6959e66

Browse files
committed
JsonEOFException is wrapped as DecodingError
Jackson2Tokenizer now also wraps JsonProcessingException's on endOfInput(), as it also does in tokenize(DataBuffer). This ensures treating those errors as 400 vs 500. Issue: SPR-16521
1 parent a6d527e commit 6959e66

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.fasterxml.jackson.core.JsonToken;
2828
import com.fasterxml.jackson.core.async.ByteArrayFeeder;
2929
import com.fasterxml.jackson.databind.util.TokenBuffer;
30-
import org.jetbrains.annotations.NotNull;
3130
import reactor.core.publisher.Flux;
3231

3332
import org.springframework.core.codec.DecodingException;
@@ -114,12 +113,15 @@ private Flux<TokenBuffer> endOfInput() {
114113
try {
115114
return parseTokenBufferFlux();
116115
}
116+
catch (JsonProcessingException ex) {
117+
return Flux.error(new DecodingException(
118+
"JSON decoding error: " + ex.getOriginalMessage(), ex));
119+
}
117120
catch (IOException ex) {
118121
return Flux.error(ex);
119122
}
120123
}
121124

122-
@NotNull
123125
private Flux<TokenBuffer> parseTokenBufferFlux() throws IOException {
124126
List<TokenBuffer> result = new ArrayList<>();
125127

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@
3232
import reactor.core.publisher.Flux;
3333
import reactor.test.StepVerifier;
3434

35+
import org.springframework.core.codec.DecodingException;
3536
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
3637
import org.springframework.core.io.buffer.DataBuffer;
3738

38-
import static java.util.Arrays.asList;
39-
import static java.util.Collections.singletonList;
39+
import static java.util.Arrays.*;
40+
import static java.util.Collections.*;
4041

4142
/**
4243
* @author Arjen Poutsma
@@ -174,6 +175,14 @@ public void tokenizeArrayElements() {
174175
asList("1", "2", "3"), true);
175176
}
176177

178+
@Test(expected = DecodingException.class) // SPR-16521
179+
public void jsonEOFExceptionIsWrappedAsDecodingError() {
180+
Flux<DataBuffer> source = Flux.just(stringBuffer("{\"status\": \"noClosingQuote}"));
181+
Flux<TokenBuffer> tokens = Jackson2Tokenizer.tokenize(source, this.jsonFactory, false);
182+
tokens.blockLast();
183+
}
184+
185+
177186
private void testTokenize(List<String> source, List<String> expected, boolean tokenizeArrayElements) {
178187
Flux<DataBuffer> sourceFlux = Flux.fromIterable(source)
179188
.map(this::stringBuffer);

0 commit comments

Comments
 (0)