SPR-7439 - JSON (jackson) @RequestBody marshalling throws awkward exception
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@3563 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
parent
326359f297
commit
120aa89907
|
|
@ -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,8 +131,13 @@ 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);
|
||||||
|
try {
|
||||||
return this.objectMapper.readValue(inputMessage.getBody(), javaType);
|
return this.objectMapper.readValue(inputMessage.getBody(), javaType);
|
||||||
}
|
}
|
||||||
|
catch (JsonParseException ex) {
|
||||||
|
throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void writeInternal(Object o, HttpOutputMessage outputMessage)
|
protected void writeInternal(Object o, HttpOutputMessage outputMessage)
|
||||||
|
|
@ -139,11 +146,16 @@ 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);
|
||||||
|
try {
|
||||||
if (this.prefixJson) {
|
if (this.prefixJson) {
|
||||||
jsonGenerator.writeRaw("{} && ");
|
jsonGenerator.writeRaw("{} && ");
|
||||||
}
|
}
|
||||||
this.objectMapper.writeValue(jsonGenerator, o);
|
this.objectMapper.writeValue(jsonGenerator, o);
|
||||||
}
|
}
|
||||||
|
catch (JsonGenerationException ex) {
|
||||||
|
throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private JsonEncoding getEncoding(MediaType contentType) {
|
private JsonEncoding getEncoding(MediaType contentType) {
|
||||||
if (contentType != null && contentType.getCharSet() != null) {
|
if (contentType != null && contentType.getCharSet() != null) {
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in New Issue