Skip to content

Improve Javadoc on configuring exception resolvers via WebMvcConfigurer [SPR-15324] #19887

@spring-projects-issues

Description

@spring-projects-issues

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

Metadata

Metadata

Assignees

Labels

in: webIssues in web modules (web, webmvc, webflux, websocket)type: taskA general task

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions