diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java index 0d58e8c134..3e5fd73659 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,9 @@ package org.springframework.web.servlet.mvc.annotation; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.context.MessageSource; +import org.springframework.context.MessageSourceAware; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.ResponseStatus; @@ -32,9 +35,17 @@ import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver; *
This exception resolver is enabled by default in the {@link org.springframework.web.servlet.DispatcherServlet}. * * @author Arjen Poutsma + * @author Rossen Stoyanchev * @since 3.0 */ -public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionResolver { +public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionResolver implements MessageSourceAware { + + private MessageSource messageSource; + + + public void setMessageSource(MessageSource messageSource) { + this.messageSource = messageSource; + } @Override protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, @@ -69,6 +80,9 @@ public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionRes int statusCode = responseStatus.value().value(); String reason = responseStatus.reason(); + if (this.messageSource != null) { + reason = this.messageSource.getMessage(reason, null, reason, LocaleContextHolder.getLocale()); + } if (!StringUtils.hasLength(reason)) { response.sendError(statusCode); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolverTests.java index 684550e18d..25348f53f7 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolverTests.java @@ -1,13 +1,20 @@ package org.springframework.web.servlet.mvc.annotation; import static org.junit.Assert.*; + +import java.util.Locale; + import org.junit.Before; import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.context.support.StaticMessageSource; import org.springframework.http.HttpStatus; import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.mock.web.test.MockHttpServletResponse; import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.context.support.StaticWebApplicationContext; import org.springframework.web.servlet.ModelAndView; /** @author Arjen Poutsma */ @@ -46,6 +53,24 @@ public class ResponseStatusExceptionResolverTests { assertEquals("Invalid status reason", "You suck!", response.getErrorMessage()); } + @Test + public void statusCodeAndReasonMessage() { + Locale locale = Locale.CHINESE; + LocaleContextHolder.setLocale(locale); + try { + StaticMessageSource messageSource = new StaticMessageSource(); + messageSource.addMessage("gone.reason", locale, "Gone reason message"); + exceptionResolver.setMessageSource(messageSource); + + StatusCodeAndReasonMessageException ex = new StatusCodeAndReasonMessageException(); + ModelAndView mav = exceptionResolver.resolveException(request, response, null, ex); + assertEquals("Invalid status reason", "Gone reason message", response.getErrorMessage()); + } + finally { + LocaleContextHolder.resetLocaleContext(); + } + } + @Test public void notAnnotated() { Exception ex = new Exception(); @@ -65,4 +90,11 @@ public class ResponseStatusExceptionResolverTests { private static class StatusCodeAndReasonException extends Exception { } + + @ResponseStatus(value = HttpStatus.GONE, reason = "gone.reason") + @SuppressWarnings("serial") + private static class StatusCodeAndReasonMessageException extends Exception { + + } + }