Skip to content

Commit ac1d2d9

Browse files
committed
SPR-7439 - JSON (jackson) @RequestBody marshalling throws awkward exception
1 parent b90260f commit ac1d2d9

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
import org.codehaus.jackson.JsonEncoding;
2424
import org.codehaus.jackson.JsonGenerator;
25+
import org.codehaus.jackson.JsonGenerationException;
26+
import org.codehaus.jackson.JsonParseException;
2527
import org.codehaus.jackson.map.ObjectMapper;
2628
import org.codehaus.jackson.map.type.TypeFactory;
2729
import org.codehaus.jackson.type.JavaType;
@@ -45,7 +47,7 @@
4547
*
4648
* @author Arjen Poutsma
4749
* @since 3.0
48-
* @see org.springframework.web.servlet.view.json.BindingJacksonJsonView
50+
* @see org.springframework.web.servlet.view.json.MappingJacksonJsonView
4951
*/
5052
public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
5153

@@ -129,7 +131,12 @@ protected boolean supports(Class<?> clazz) {
129131
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)
130132
throws IOException, HttpMessageNotReadableException {
131133
JavaType javaType = getJavaType(clazz);
132-
return this.objectMapper.readValue(inputMessage.getBody(), javaType);
134+
try {
135+
return this.objectMapper.readValue(inputMessage.getBody(), javaType);
136+
}
137+
catch (JsonParseException ex) {
138+
throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex);
139+
}
133140
}
134141

135142
@Override
@@ -139,10 +146,15 @@ protected void writeInternal(Object o, HttpOutputMessage outputMessage)
139146
JsonEncoding encoding = getEncoding(outputMessage.getHeaders().getContentType());
140147
JsonGenerator jsonGenerator =
141148
this.objectMapper.getJsonFactory().createJsonGenerator(outputMessage.getBody(), encoding);
142-
if (this.prefixJson) {
143-
jsonGenerator.writeRaw("{} && ");
149+
try {
150+
if (this.prefixJson) {
151+
jsonGenerator.writeRaw("{} && ");
152+
}
153+
this.objectMapper.writeValue(jsonGenerator, o);
154+
}
155+
catch (JsonGenerationException ex) {
156+
throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
144157
}
145-
this.objectMapper.writeValue(jsonGenerator, o);
146158
}
147159

148160
private JsonEncoding getEncoding(MediaType contentType) {

org.springframework.web/src/test/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverterTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.http.MediaType;
3333
import org.springframework.http.MockHttpInputMessage;
3434
import org.springframework.http.MockHttpOutputMessage;
35+
import org.springframework.http.converter.HttpMessageNotReadableException;
3536

3637
/**
3738
* @author Arjen Poutsma
@@ -155,6 +156,15 @@ public void writeUTF16() throws IOException {
155156
assertEquals("Invalid content-type", contentType, outputMessage.getHeaders().getContentType());
156157
}
157158

159+
@Test(expected = HttpMessageNotReadableException.class)
160+
public void readInvalidJson() throws IOException {
161+
String body = "FooBar";
162+
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8"));
163+
inputMessage.getHeaders().setContentType(new MediaType("application", "json"));
164+
converter.read(MyBean.class, inputMessage);
165+
}
166+
167+
158168

159169
public static class MyBean {
160170

0 commit comments

Comments
 (0)