-
Notifications
You must be signed in to change notification settings - Fork 38.7k
Description
Belozorov Volodymyr opened SPR-15324 and commented
Good time of the day, dear Spring team,
After extending WebMvcConfigurerAdapter
and configuring HttpMessageConverters
as well as HandlerExceptionResolvers
, I have the following (relevant) configuration for a servlet context
@Configuration
@EnableWebMvc
@ComponentScan({"ua.belozorov.xxx"})
public class WebConfig extends WebMvcConfigurerAdapter {
...
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter(objectMapper()));
}
...
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
exceptionResolvers.add(exceptionHandlerExceptionResolver());
exceptionResolvers.add(appHandlerExceptionResolver());
}
@Bean
public ExceptionHandlerExceptionResolver exceptionHandlerExceptionResolver() {
ExceptionHandlerExceptionResolver resolver = new ExceptionHandlerExceptionResolver();
resolver.setOrder(1);
return resolver;
}
@Bean
public AppHandlerExceptionResolver appHandlerExceptionResolver() {
AppHandlerExceptionResolver resolver = new AppHandlerExceptionResolver(objectMapper());
resolver.setOrder(2);
return resolver;
}
As a result of such configuration, ExceptionHandlerExceptionResolver
is initialized with a default list of HttpMessageConverters
(in its constructor) which doesn't get overriden later with a configured list of HttpMessageConverters
.
As I understood, this is due to the following code:
...
@Bean
public HandlerExceptionResolver handlerExceptionResolver() {
List<HandlerExceptionResolver> exceptionResolvers = new ArrayList<HandlerExceptionResolver>();
configureHandlerExceptionResolvers(exceptionResolvers);
if (exceptionResolvers.isEmpty()) {
addDefaultHandlerExceptionResolvers(exceptionResolvers);
}
...
protected final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
...
exceptionHandlerResolver.setMessageConverters(getMessageConverters());
That is, only if one does not provide his/her own list of HttpMessageConverters
(first method), the created ExceptionHandlerExceptionResolver
is configured with the supplied HttpMessageConverters
(second method)
This behavior seems a little counterintuitive to me.
Is it possible to fix by moving the converters initialization to the ExceptionHandlerExceptionResolver#afterPropertiesSet()
method?
Affects: 4.3.4