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 3797690516..674d821111 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -480,7 +480,7 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv List returnValueHandlers = new ArrayList(); addReturnValueHandlers(returnValueHandlers); - RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter(); + RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter(); adapter.setContentNegotiationManager(mvcContentNegotiationManager()); adapter.setMessageConverters(getMessageConverters()); adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer()); @@ -512,6 +512,14 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv return adapter; } + /** + * Protected method for plugging in a custom sub-class of + * {@link RequestMappingHandlerAdapter}. + */ + protected RequestMappingHandlerAdapter createRequestMappingHandlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + /** * Return the {@link ConfigurableWebBindingInitializer} to use for * initializing all {@link WebDataBinder} instances. @@ -810,25 +818,33 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv * */ protected final void addDefaultHandlerExceptionResolvers(List exceptionResolvers) { - ExceptionHandlerExceptionResolver exceptionHandlerExceptionResolver = new ExceptionHandlerExceptionResolver(); - exceptionHandlerExceptionResolver.setContentNegotiationManager(mvcContentNegotiationManager()); - exceptionHandlerExceptionResolver.setMessageConverters(getMessageConverters()); + ExceptionHandlerExceptionResolver exceptionHandlerResolver = createExceptionHandlerExceptionResolver(); + exceptionHandlerResolver.setContentNegotiationManager(mvcContentNegotiationManager()); + exceptionHandlerResolver.setMessageConverters(getMessageConverters()); if (jackson2Present) { List> interceptors = new ArrayList>(); interceptors.add(new JsonViewResponseBodyAdvice()); - exceptionHandlerExceptionResolver.setResponseBodyAdvice(interceptors); + exceptionHandlerResolver.setResponseBodyAdvice(interceptors); } - exceptionHandlerExceptionResolver.setApplicationContext(this.applicationContext); - exceptionHandlerExceptionResolver.afterPropertiesSet(); - exceptionResolvers.add(exceptionHandlerExceptionResolver); + exceptionHandlerResolver.setApplicationContext(this.applicationContext); + exceptionHandlerResolver.afterPropertiesSet(); + exceptionResolvers.add(exceptionHandlerResolver); - ResponseStatusExceptionResolver responseStatusExceptionResolver = new ResponseStatusExceptionResolver(); - responseStatusExceptionResolver.setMessageSource(this.applicationContext); - exceptionResolvers.add(responseStatusExceptionResolver); + ResponseStatusExceptionResolver responseStatusResolver = new ResponseStatusExceptionResolver(); + responseStatusResolver.setMessageSource(this.applicationContext); + exceptionResolvers.add(responseStatusResolver); exceptionResolvers.add(new DefaultHandlerExceptionResolver()); } + /** + * Protected method for plugging in a custom sub-class of + * {@link ExceptionHandlerExceptionResolver}. + */ + protected ExceptionHandlerExceptionResolver createExceptionHandlerExceptionResolver() { + return new ExceptionHandlerExceptionResolver(); + } + /** * Register a {@link ViewResolverComposite} that contains a chain of view resolvers * to use for view resolution.