Skip to content

Commit 17b9bde

Browse files
committed
Set ResponseStatusExceptionResolver.messageSource in the MVC Java config
Issue: SPR-12380
1 parent ad2d595 commit 17b9bde

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -781,11 +781,14 @@ protected final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionRe
781781
interceptors.add(new JsonViewResponseBodyAdvice());
782782
exceptionHandlerExceptionResolver.setResponseBodyAdvice(interceptors);
783783
}
784-
exceptionHandlerExceptionResolver.afterPropertiesSet();
784+
ResponseStatusExceptionResolver responseStatusExceptionResolver = new ResponseStatusExceptionResolver();
785+
responseStatusExceptionResolver.setMessageSource(this.applicationContext);
785786

786787
exceptionResolvers.add(exceptionHandlerExceptionResolver);
787-
exceptionResolvers.add(new ResponseStatusExceptionResolver());
788+
exceptionResolvers.add(responseStatusExceptionResolver);
788789
exceptionResolvers.add(new DefaultHandlerExceptionResolver());
790+
791+
exceptionHandlerExceptionResolver.afterPropertiesSet();
789792
}
790793

791794
/**

spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,25 @@
3131
import org.springframework.beans.DirectFieldAccessor;
3232
import org.springframework.beans.factory.BeanFactoryUtils;
3333
import org.springframework.context.ApplicationContext;
34+
import org.springframework.context.MessageSource;
3435
import org.springframework.context.annotation.Bean;
3536
import org.springframework.context.annotation.Configuration;
3637
import org.springframework.context.annotation.Scope;
3738
import org.springframework.context.annotation.ScopedProxyMode;
39+
import org.springframework.context.i18n.LocaleContextHolder;
40+
import org.springframework.context.support.StaticMessageSource;
3841
import org.springframework.core.Ordered;
3942
import org.springframework.core.convert.ConversionService;
4043
import org.springframework.format.annotation.DateTimeFormat;
4144
import org.springframework.format.annotation.DateTimeFormat.ISO;
4245
import org.springframework.format.support.FormattingConversionService;
4346
import org.springframework.http.HttpEntity;
47+
import org.springframework.http.HttpStatus;
4448
import org.springframework.http.converter.HttpMessageConverter;
4549
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
4650
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
4751
import org.springframework.mock.web.test.MockHttpServletRequest;
52+
import org.springframework.mock.web.test.MockHttpServletResponse;
4853
import org.springframework.mock.web.test.MockServletContext;
4954
import org.springframework.stereotype.Controller;
5055
import org.springframework.util.AntPathMatcher;
@@ -53,6 +58,7 @@
5358
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
5459
import org.springframework.web.bind.annotation.PathVariable;
5560
import org.springframework.web.bind.annotation.RequestMapping;
61+
import org.springframework.web.bind.annotation.ResponseStatus;
5662
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
5763
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
5864
import org.springframework.web.method.support.CompositeUriComponentsContributor;
@@ -219,6 +225,19 @@ public void handlerExceptionResolver() throws Exception {
219225
List<Object> interceptors = (List<Object>) fieldAccessor.getPropertyValue("responseBodyAdvice");
220226
assertEquals(1, interceptors.size());
221227
assertEquals(JsonViewResponseBodyAdvice.class, interceptors.get(0).getClass());
228+
229+
LocaleContextHolder.setLocale(Locale.ENGLISH);
230+
try {
231+
ResponseStatusExceptionResolver rser = (ResponseStatusExceptionResolver) expectedResolvers.get(1);
232+
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/");
233+
MockHttpServletResponse response = new MockHttpServletResponse();
234+
rser.resolveException(request, response, context.getBean(TestController.class), new UserAlreadyExistsException());
235+
assertEquals("User already exists!", response.getErrorMessage());
236+
}
237+
finally {
238+
LocaleContextHolder.resetLocaleContext();
239+
}
240+
222241
}
223242

224243
@Test
@@ -289,6 +308,13 @@ public static class WebConfig {
289308
public TestController testController() {
290309
return new TestController();
291310
}
311+
312+
@Bean
313+
public MessageSource messageSource() {
314+
StaticMessageSource messageSource = new StaticMessageSource();
315+
messageSource.addMessage("exception.user.exists", Locale.ENGLISH, "User already exists!");
316+
return messageSource;
317+
}
292318
}
293319

294320
@Configuration
@@ -345,4 +371,8 @@ public void handle() {
345371
}
346372
}
347373

374+
@ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "exception.user.exists")
375+
public static class UserAlreadyExistsException extends RuntimeException {
376+
}
377+
348378
}

0 commit comments

Comments
 (0)