From efaa9416720f4f60d8efb09538954b516cc55340 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 23 Jun 2011 13:17:18 +0000 Subject: [PATCH] SPR-8476 Translate JsonMappingExceptions to HttpMessageNotReadableException (and thus response status code 400) consistent with JsonParseExceptions --- .../json/MappingJacksonHttpMessageConverter.java | 4 ++++ .../MappingJacksonHttpMessageConverterTests.java | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 4 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 664299a56ca..d747acf7fd5 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 @@ -25,6 +25,7 @@ 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.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.type.TypeFactory; import org.codehaus.jackson.type.JavaType; @@ -138,6 +139,9 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve catch (JsonParseException ex) { throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex); } + catch (JsonMappingException ex) { + throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex); + } catch (EOFException ex) { throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex); } 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 3532068f8de..b26799f60cd 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 @@ -16,6 +16,10 @@ package org.springframework.http.converter.json; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; @@ -25,10 +29,8 @@ import java.util.Map; import org.codehaus.jackson.map.type.TypeFactory; import org.codehaus.jackson.type.JavaType; -import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; - import org.springframework.http.MediaType; import org.springframework.http.MockHttpInputMessage; import org.springframework.http.MockHttpOutputMessage; @@ -114,7 +116,7 @@ public class MappingJacksonHttpMessageConverterTests { assertEquals("Foo", result.get("string")); assertEquals(42, result.get("number")); assertEquals(42D, (Double) result.get("fraction"), 0D); - List array = new ArrayList(); + List array = new ArrayList(); array.add("Foo"); array.add("Bar"); assertEquals(array, result.get("array")); @@ -164,7 +166,13 @@ public class MappingJacksonHttpMessageConverterTests { converter.read(MyBean.class, inputMessage); } - + @Test(expected = HttpMessageNotReadableException.class) + public void readValidJsonWithUnknownProperty() throws IOException { + String body = "{\"string\":\"string\",\"unknownProperty\":\"value\"}"; + MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); + inputMessage.getHeaders().setContentType(new MediaType("application", "json")); + converter.read(MyBean.class, inputMessage); + } public static class MyBean {