diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index a52668c41d..6886f6e00c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -781,11 +781,14 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv interceptors.add(new JsonViewResponseBodyAdvice()); exceptionHandlerExceptionResolver.setResponseBodyAdvice(interceptors); } - exceptionHandlerExceptionResolver.afterPropertiesSet(); + ResponseStatusExceptionResolver responseStatusExceptionResolver = new ResponseStatusExceptionResolver(); + responseStatusExceptionResolver.setMessageSource(this.applicationContext); exceptionResolvers.add(exceptionHandlerExceptionResolver); - exceptionResolvers.add(new ResponseStatusExceptionResolver()); + exceptionResolvers.add(responseStatusExceptionResolver); exceptionResolvers.add(new DefaultHandlerExceptionResolver()); + + exceptionHandlerExceptionResolver.afterPropertiesSet(); } /** diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java index e15e7f859e..d9ed4a7fda 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java @@ -31,20 +31,25 @@ import org.junit.Test; import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.context.ApplicationContext; +import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.context.support.StaticMessageSource; import org.springframework.core.Ordered; import org.springframework.core.convert.ConversionService; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat.ISO; import org.springframework.format.support.FormattingConversionService; import org.springframework.http.HttpEntity; +import org.springframework.http.HttpStatus; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.mock.web.test.MockHttpServletRequest; +import org.springframework.mock.web.test.MockHttpServletResponse; import org.springframework.mock.web.test.MockServletContext; import org.springframework.stereotype.Controller; import org.springframework.util.AntPathMatcher; @@ -53,6 +58,7 @@ import org.springframework.validation.Validator; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.method.support.CompositeUriComponentsContributor; @@ -219,6 +225,19 @@ public class WebMvcConfigurationSupportTests { List interceptors = (List) fieldAccessor.getPropertyValue("responseBodyAdvice"); assertEquals(1, interceptors.size()); assertEquals(JsonViewResponseBodyAdvice.class, interceptors.get(0).getClass()); + + LocaleContextHolder.setLocale(Locale.ENGLISH); + try { + ResponseStatusExceptionResolver rser = (ResponseStatusExceptionResolver) expectedResolvers.get(1); + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/"); + MockHttpServletResponse response = new MockHttpServletResponse(); + rser.resolveException(request, response, context.getBean(TestController.class), new UserAlreadyExistsException()); + assertEquals("User already exists!", response.getErrorMessage()); + } + finally { + LocaleContextHolder.resetLocaleContext(); + } + } @Test @@ -289,6 +308,13 @@ public class WebMvcConfigurationSupportTests { public TestController testController() { return new TestController(); } + + @Bean + public MessageSource messageSource() { + StaticMessageSource messageSource = new StaticMessageSource(); + messageSource.addMessage("exception.user.exists", Locale.ENGLISH, "User already exists!"); + return messageSource; + } } @Configuration @@ -345,4 +371,8 @@ public class WebMvcConfigurationSupportTests { } } + @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "exception.user.exists") + public static class UserAlreadyExistsException extends RuntimeException { + } + }