From ac1d2d93d6beb85f468cb669a83d9fdc9a289c84 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Wed, 11 Aug 2010 08:16:12 +0000 Subject: [PATCH] SPR-7439 - JSON (jackson) @RequestBody marshalling throws awkward exception --- .../MappingJacksonHttpMessageConverter.java | 22 ++++++++++++++----- ...ppingJacksonHttpMessageConverterTests.java | 10 +++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java b/org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java index deafebd8e5..ba1bf128f3 100644 --- a/org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java +++ b/org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java @@ -22,6 +22,8 @@ import java.util.List; import org.codehaus.jackson.JsonEncoding; import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.JsonGenerationException; +import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.type.TypeFactory; import org.codehaus.jackson.type.JavaType; @@ -45,7 +47,7 @@ import org.springframework.util.Assert; * * @author Arjen Poutsma * @since 3.0 - * @see org.springframework.web.servlet.view.json.BindingJacksonJsonView + * @see org.springframework.web.servlet.view.json.MappingJacksonJsonView */ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConverter { @@ -129,7 +131,12 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { JavaType javaType = getJavaType(clazz); - return this.objectMapper.readValue(inputMessage.getBody(), javaType); + try { + return this.objectMapper.readValue(inputMessage.getBody(), javaType); + } + catch (JsonParseException ex) { + throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex); + } } @Override @@ -139,10 +146,15 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve JsonEncoding encoding = getEncoding(outputMessage.getHeaders().getContentType()); JsonGenerator jsonGenerator = this.objectMapper.getJsonFactory().createJsonGenerator(outputMessage.getBody(), encoding); - if (this.prefixJson) { - jsonGenerator.writeRaw("{} && "); + try { + if (this.prefixJson) { + jsonGenerator.writeRaw("{} && "); + } + this.objectMapper.writeValue(jsonGenerator, o); + } + catch (JsonGenerationException ex) { + throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex); } - this.objectMapper.writeValue(jsonGenerator, o); } private JsonEncoding getEncoding(MediaType contentType) { diff --git a/org.springframework.web/src/test/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverterTests.java b/org.springframework.web/src/test/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverterTests.java index a79ec58b66..3532068f8d 100644 --- a/org.springframework.web/src/test/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverterTests.java +++ b/org.springframework.web/src/test/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverterTests.java @@ -32,6 +32,7 @@ import org.junit.Test; import org.springframework.http.MediaType; import org.springframework.http.MockHttpInputMessage; import org.springframework.http.MockHttpOutputMessage; +import org.springframework.http.converter.HttpMessageNotReadableException; /** * @author Arjen Poutsma @@ -155,6 +156,15 @@ public class MappingJacksonHttpMessageConverterTests { assertEquals("Invalid content-type", contentType, outputMessage.getHeaders().getContentType()); } + @Test(expected = HttpMessageNotReadableException.class) + public void readInvalidJson() throws IOException { + String body = "FooBar"; + MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); + inputMessage.getHeaders().setContentType(new MediaType("application", "json")); + converter.read(MyBean.class, inputMessage); + } + + public static class MyBean { -- GitLab