SPR-7439 - JSON (jackson) @RequestBody marshalling throws awkward exception

master
Arjen Poutsma 14 years ago
parent b90260f8d2
commit ac1d2d93d6
  1. 22
      org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java
  2. 10
      org.springframework.web/src/test/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverterTests.java

@ -22,6 +22,8 @@ import java.util.List;
import org.codehaus.jackson.JsonEncoding; import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonGenerator; 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.ObjectMapper;
import org.codehaus.jackson.map.type.TypeFactory; import org.codehaus.jackson.map.type.TypeFactory;
import org.codehaus.jackson.type.JavaType; import org.codehaus.jackson.type.JavaType;
@ -45,7 +47,7 @@ import org.springframework.util.Assert;
* *
* @author Arjen Poutsma * @author Arjen Poutsma
* @since 3.0 * @since 3.0
* @see org.springframework.web.servlet.view.json.BindingJacksonJsonView * @see org.springframework.web.servlet.view.json.MappingJacksonJsonView
*/ */
public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConverter<Object> { public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
@ -129,7 +131,12 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException { throws IOException, HttpMessageNotReadableException {
JavaType javaType = getJavaType(clazz); 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 @Override
@ -139,10 +146,15 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve
JsonEncoding encoding = getEncoding(outputMessage.getHeaders().getContentType()); JsonEncoding encoding = getEncoding(outputMessage.getHeaders().getContentType());
JsonGenerator jsonGenerator = JsonGenerator jsonGenerator =
this.objectMapper.getJsonFactory().createJsonGenerator(outputMessage.getBody(), encoding); this.objectMapper.getJsonFactory().createJsonGenerator(outputMessage.getBody(), encoding);
if (this.prefixJson) { try {
jsonGenerator.writeRaw("{} && "); 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) { private JsonEncoding getEncoding(MediaType contentType) {

@ -32,6 +32,7 @@ import org.junit.Test;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.MockHttpInputMessage; import org.springframework.http.MockHttpInputMessage;
import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.MockHttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotReadableException;
/** /**
* @author Arjen Poutsma * @author Arjen Poutsma
@ -155,6 +156,15 @@ public class MappingJacksonHttpMessageConverterTests {
assertEquals("Invalid content-type", contentType, outputMessage.getHeaders().getContentType()); 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 { public static class MyBean {

Loading…
Cancel
Save