From 81143a80c453be9665f86ac06ef0b67d40971d79 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 8 May 2017 08:42:06 +0200 Subject: [PATCH] Wrap IOException as HttpMessageNotReadableException for RestTemplate usage In the 4.3.x line, conversion exceptions do not get wrapped as RestClientException yet, so the expectation remains to receive a HttpMessageNotReadableException for conversion-level IOExceptions. Issue: SPR-13592 --- .../AbstractJackson2HttpMessageConverter.java | 5 ++++- ...gJackson2XmlHttpMessageConverterTests.java | 20 +++++-------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java index be774d59f1..5eb2cdfd02 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java @@ -219,7 +219,7 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener return readJavaType(javaType, inputMessage); } - private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) throws IOException { + private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) { try { if (inputMessage instanceof MappingJacksonInputMessage) { Class deserializationView = ((MappingJacksonInputMessage) inputMessage).getDeserializationView(); @@ -233,6 +233,9 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener catch (JsonProcessingException ex) { throw new HttpMessageNotReadableException("JSON parse error: " + ex.getOriginalMessage(), ex); } + catch (IOException ex) { + throw new HttpMessageNotReadableException("I/O error while reading input message", ex); + } } @Override diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java index 965a3870ac..54ff4a7538 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java @@ -17,7 +17,6 @@ package org.springframework.http.converter.xml; import java.io.IOException; -import java.lang.reflect.Method; import java.nio.charset.Charset; import com.fasterxml.jackson.annotation.JsonView; @@ -27,11 +26,10 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.core.io.ClassPathResource; -import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.MockHttpInputMessage; import org.springframework.http.MockHttpOutputMessage; -import org.springframework.http.converter.AbstractHttpMessageConverter; +import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.json.MappingJacksonValue; import static org.hamcrest.CoreMatchers.*; @@ -102,7 +100,7 @@ public class MappingJackson2XmlHttpMessageConverterTests { outputMessage.getHeaders().getContentType()); } - @Test(expected = IOException.class) + @Test(expected = HttpMessageNotReadableException.class) public void readInvalidXml() throws IOException { String body = "FooBar"; MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); @@ -129,7 +127,7 @@ public class MappingJackson2XmlHttpMessageConverterTests { MappingJacksonValue jacksonValue = new MappingJacksonValue(bean); jacksonValue.setSerializationView(MyJacksonView1.class); - this.writeInternal(jacksonValue, outputMessage); + this.converter.write(jacksonValue, null, outputMessage); String result = outputMessage.getBodyAsString(Charset.forName("UTF-8")); assertThat(result, containsString("with")); @@ -154,7 +152,7 @@ public class MappingJackson2XmlHttpMessageConverterTests { MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); inputMessage.getHeaders().setContentType(new MediaType("application", "xml")); - this.thrown.expect(IOException.class); + this.thrown.expect(HttpMessageNotReadableException.class); this.converter.read(MyBean.class, inputMessage); } @@ -181,19 +179,11 @@ public class MappingJackson2XmlHttpMessageConverterTests { MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); inputMessage.getHeaders().setContentType(new MediaType("application", "xml")); - this.thrown.expect(IOException.class); + this.thrown.expect(HttpMessageNotReadableException.class); this.converter.read(MyBean.class, inputMessage); } - private void writeInternal(Object object, HttpOutputMessage outputMessage) throws Exception { - Method method = AbstractHttpMessageConverter.class.getDeclaredMethod( - "writeInternal", Object.class, HttpOutputMessage.class); - method.setAccessible(true); - method.invoke(this.converter, object, outputMessage); - } - - public static class MyBean { private String string;