diff --git a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConversionException.java b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConversionException.java index b44ad6a5b5e2885fd838a99407938e339bd7f10d..b9fc38ff6c333282979334e52ad94c7eb67a6ef6 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConversionException.java +++ b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConversionException.java @@ -17,9 +17,6 @@ package org.springframework.http.converter; import org.springframework.core.NestedRuntimeException; -import org.springframework.http.HttpStatus; - -import java.util.Optional; /** * Thrown by {@link HttpMessageConverter} implementations when a conversion attempt fails. @@ -31,15 +28,12 @@ import java.util.Optional; @SuppressWarnings("serial") public class HttpMessageConversionException extends NestedRuntimeException { - private final HttpStatus errorStatus; - /** * Create a new HttpMessageConversionException. * @param msg the detail message */ public HttpMessageConversionException(String msg) { super(msg); - this.errorStatus = null; } /** @@ -49,25 +43,6 @@ public class HttpMessageConversionException extends NestedRuntimeException { */ public HttpMessageConversionException(String msg, Throwable cause) { super(msg, cause); - this.errorStatus = null; } - /** - * Create a new HttpMessageConversionException. - * @since 5.0 - * @param msg the detail message - * @param cause the root cause (if any) - * @param errorStatus the HTTP error status related to this exception - */ - public HttpMessageConversionException(String msg, Throwable cause, HttpStatus errorStatus) { - super(msg, cause); - this.errorStatus = errorStatus; - } - - /** - * Return the HTTP error status related to this exception if any. - */ - public Optional getErrorStatus() { - return Optional.ofNullable(errorStatus); - } } diff --git a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotReadableException.java b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotReadableException.java index 5ac2c6a351f86feebe4754183dd7dad3e9051a11..8d35ac90c3d38bcc29fc424581108f7a52de70af 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotReadableException.java +++ b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotReadableException.java @@ -16,8 +16,6 @@ package org.springframework.http.converter; -import org.springframework.http.HttpStatus; - /** * Thrown by {@link HttpMessageConverter} implementations when the * {@link HttpMessageConverter#read} method fails. @@ -45,15 +43,4 @@ public class HttpMessageNotReadableException extends HttpMessageConversionExcept super(msg, cause); } - /** - * Create a new HttpMessageNotReadableException. - * @since 5.0 - * @param msg the detail message - * @param cause the root cause (if any) - * @param errorStatus the HTTP error status related to this exception - */ - public HttpMessageNotReadableException(String msg, Throwable cause, HttpStatus errorStatus) { - super(msg, cause, errorStatus); - } - } 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 2a85fb4e16c3c0e51ee451bafb6862344bd64b9a..67cbcf634dc7198f7ad23816e76af64f0921e618 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 @@ -41,9 +41,9 @@ import com.fasterxml.jackson.databind.type.TypeFactory; import org.springframework.core.GenericTypeResolver; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.converter.AbstractGenericHttpMessageConverter; +import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; @@ -230,11 +230,13 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener return this.objectMapper.readValue(inputMessage.getBody(), javaType); } catch (InvalidDefinitionException ex) { - throw new HttpMessageNotReadableException( - "Could not map JSON to target object of " + javaType, ex, HttpStatus.INTERNAL_SERVER_ERROR); + throw new HttpMessageConversionException("Type definition error: " + ex.getMessage(), ex); + } + catch (JsonProcessingException ex) { + throw new HttpMessageNotReadableException("JSON parse error: " + ex.getMessage(), ex); } catch (IOException ex) { - throw new HttpMessageNotReadableException("Could not read JSON document: " + ex.getMessage(), ex); + throw new HttpMessageNotReadableException("I/O error while reading: " + ex.getMessage(), ex); } } diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java index 2ab61db3047d88c8967fb4a34d6a6e186fc651e4..fbca48a8156df62a0965bc83b343be2e10ec1cc7 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java @@ -34,14 +34,21 @@ import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import org.junit.Test; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.MockHttpInputMessage; import org.springframework.http.MockHttpOutputMessage; +import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.http.converter.HttpMessageNotReadableException; -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; /** * Jackson 2.x converter tests. @@ -388,9 +395,8 @@ public class MappingJackson2HttpMessageConverterTests { try { converter.read(BeanWithNoDefaultConstructor.class, inputMessage); } - catch (HttpMessageNotReadableException ex) { - assertTrue(ex.getErrorStatus().isPresent()); - assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, ex.getErrorStatus().get()); + catch (HttpMessageConversionException ex) { + assertTrue(ex.getMessage(), ex.getMessage().startsWith("Type definition error:")); return; } fail(); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java index 375c582268eaacc7656570f7cf9485f2a304bc2f..80e61a3881d3d5721cb0fb7220f43ca2c4aee286 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java @@ -27,7 +27,6 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.ConversionNotSupportedException; import org.springframework.beans.TypeMismatchException; import org.springframework.core.Ordered; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; @@ -355,7 +354,7 @@ public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionRes if (logger.isWarnEnabled()) { logger.warn("Failed to read HTTP message: " + ex); } - response.sendError(ex.getErrorStatus().orElse(HttpStatus.BAD_REQUEST).value()); + response.sendError(HttpServletResponse.SC_BAD_REQUEST); return new ModelAndView(); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java index 42fe205d2619d8e148bfc014f875cca17b68c324..1e22689fcbe9187951bd2124aa4483d4587a659e 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java @@ -141,7 +141,14 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.support.RequestContextUtils; import org.springframework.web.servlet.view.InternalResourceViewResolver; -import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; /** * @author Rossen Stoyanchev