diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java index 9b75ed107c43bcfbc422660964b875140d60c4dc..0065ed4a6c6681a102914e9e7b59a49fefb71ed4 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java @@ -45,6 +45,7 @@ import org.springframework.core.annotation.AnnotationUtils; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; +import org.springframework.http.HttpStatus; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; @@ -56,6 +57,7 @@ import org.springframework.ui.Model; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; @@ -347,10 +349,16 @@ public class AnnotationMethodHandlerExceptionResolver extends AbstractHandlerExc private ModelAndView getModelAndView(Method handlerMethod, Object returnValue, ServletWebRequest webRequest) throws Exception { - ResponseStatus responseStatus = AnnotationUtils.findAnnotation(handlerMethod, ResponseStatus.class); - if (responseStatus != null) { - HttpServletResponse response = webRequest.getResponse(); - response.setStatus(responseStatus.value().value()); + ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(handlerMethod, ResponseStatus.class); + if (responseStatusAnn != null) { + HttpStatus responseStatus = responseStatusAnn.value(); + String reason = responseStatusAnn.reason(); + if (!StringUtils.hasText(reason)) { + webRequest.getResponse().setStatus(responseStatus.value()); + } + else { + webRequest.getResponse().sendError(responseStatus.value(), reason); + } } if (returnValue != null && AnnotationUtils.findAnnotation(handlerMethod, ResponseBody.class) != null) { diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolverTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolverTests.java index fddb70ea6b192cc3ad2a7ac0b47aa4c9670c9da9..412ed1b029d06f928e5ba447f8804b2a4cbd683f 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolverTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolverTests.java @@ -78,6 +78,7 @@ public class AnnotationMethodHandlerExceptionResolverTests { assertNotNull("No ModelAndView returned", mav); assertEquals("Invalid view name returned", "Y:SocketException", mav.getViewName()); assertEquals("Invalid status code returned", 406, response.getStatus()); + assertEquals("Invalid status reason returned", "This is simply unacceptable!", response.getErrorMessage()); } @Test @@ -149,7 +150,7 @@ public class AnnotationMethodHandlerExceptionResolverTests { } @ExceptionHandler(SocketException.class) - @ResponseStatus(HttpStatus.NOT_ACCEPTABLE) + @ResponseStatus(value = HttpStatus.NOT_ACCEPTABLE, reason = "This is simply unacceptable!") public String handleSocketException(Exception ex, HttpServletResponse response) { return "Y:" + ClassUtils.getShortName(ex.getClass()); }