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
This commit is contained in:
parent
9572859a35
commit
81143a80c4
|
@ -219,7 +219,7 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener
|
||||||
return readJavaType(javaType, inputMessage);
|
return readJavaType(javaType, inputMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) throws IOException {
|
private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) {
|
||||||
try {
|
try {
|
||||||
if (inputMessage instanceof MappingJacksonInputMessage) {
|
if (inputMessage instanceof MappingJacksonInputMessage) {
|
||||||
Class<?> deserializationView = ((MappingJacksonInputMessage) inputMessage).getDeserializationView();
|
Class<?> deserializationView = ((MappingJacksonInputMessage) inputMessage).getDeserializationView();
|
||||||
|
@ -233,6 +233,9 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener
|
||||||
catch (JsonProcessingException ex) {
|
catch (JsonProcessingException ex) {
|
||||||
throw new HttpMessageNotReadableException("JSON parse error: " + ex.getOriginalMessage(), 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
|
@Override
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
package org.springframework.http.converter.xml;
|
package org.springframework.http.converter.xml;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonView;
|
import com.fasterxml.jackson.annotation.JsonView;
|
||||||
|
@ -27,11 +26,10 @@ import org.junit.Test;
|
||||||
import org.junit.rules.ExpectedException;
|
import org.junit.rules.ExpectedException;
|
||||||
|
|
||||||
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.core.io.ClassPathResource;
|
||||||
import org.springframework.http.HttpOutputMessage;
|
|
||||||
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.AbstractHttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageNotReadableException;
|
||||||
import org.springframework.http.converter.json.MappingJacksonValue;
|
import org.springframework.http.converter.json.MappingJacksonValue;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.*;
|
import static org.hamcrest.CoreMatchers.*;
|
||||||
|
@ -102,7 +100,7 @@ public class MappingJackson2XmlHttpMessageConverterTests {
|
||||||
outputMessage.getHeaders().getContentType());
|
outputMessage.getHeaders().getContentType());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = IOException.class)
|
@Test(expected = HttpMessageNotReadableException.class)
|
||||||
public void readInvalidXml() throws IOException {
|
public void readInvalidXml() throws IOException {
|
||||||
String body = "FooBar";
|
String body = "FooBar";
|
||||||
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8"));
|
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8"));
|
||||||
|
@ -129,7 +127,7 @@ public class MappingJackson2XmlHttpMessageConverterTests {
|
||||||
|
|
||||||
MappingJacksonValue jacksonValue = new MappingJacksonValue(bean);
|
MappingJacksonValue jacksonValue = new MappingJacksonValue(bean);
|
||||||
jacksonValue.setSerializationView(MyJacksonView1.class);
|
jacksonValue.setSerializationView(MyJacksonView1.class);
|
||||||
this.writeInternal(jacksonValue, outputMessage);
|
this.converter.write(jacksonValue, null, outputMessage);
|
||||||
|
|
||||||
String result = outputMessage.getBodyAsString(Charset.forName("UTF-8"));
|
String result = outputMessage.getBodyAsString(Charset.forName("UTF-8"));
|
||||||
assertThat(result, containsString("<withView1>with</withView1>"));
|
assertThat(result, containsString("<withView1>with</withView1>"));
|
||||||
|
@ -154,7 +152,7 @@ public class MappingJackson2XmlHttpMessageConverterTests {
|
||||||
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8"));
|
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8"));
|
||||||
inputMessage.getHeaders().setContentType(new MediaType("application", "xml"));
|
inputMessage.getHeaders().setContentType(new MediaType("application", "xml"));
|
||||||
|
|
||||||
this.thrown.expect(IOException.class);
|
this.thrown.expect(HttpMessageNotReadableException.class);
|
||||||
this.converter.read(MyBean.class, inputMessage);
|
this.converter.read(MyBean.class, inputMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,19 +179,11 @@ public class MappingJackson2XmlHttpMessageConverterTests {
|
||||||
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8"));
|
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8"));
|
||||||
inputMessage.getHeaders().setContentType(new MediaType("application", "xml"));
|
inputMessage.getHeaders().setContentType(new MediaType("application", "xml"));
|
||||||
|
|
||||||
this.thrown.expect(IOException.class);
|
this.thrown.expect(HttpMessageNotReadableException.class);
|
||||||
this.converter.read(MyBean.class, inputMessage);
|
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 {
|
public static class MyBean {
|
||||||
|
|
||||||
private String string;
|
private String string;
|
||||||
|
|
Loading…
Reference in New Issue