是否可以扩展WebMvcConfigurationSupport并使用WebMvcAutoConfiguration?

我需要扩展WebMvcConfigurationSupport类,修改两件事:

@Configuration public class WebConfig extends WebMvcConfigurationSupport { @Override public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping(); handlerMapping.setRemoveSemicolonContent(false); handlerMapping.setOrder(1); return handlerMapping; } } 

我喜欢从WebMvcAutoConfiguration类注册的默认值,但由于类上的条件注释,当我扩展WebMvcConfigurationSupport类时,它会阻止自动配置发生。

 @Configuration @ConditionalOnWebApplication @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class }) @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @Order(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter(DispatcherServletAutoConfiguration.class) public class WebMvcAutoConfiguration {...} 

是否要加载WebMvcAutoConfiguration类而不必实际复制/粘贴该类中的大多数代码?

或者是否可以从其他地方调用RequestMappingHandlerMapping setOrder()和setRemoveSemicolonContent(),这样我就可以使用@EnableWebMvc注释并运行自动配置类而没有任何问题?

提前致谢!

您的分析是正确的( @EnableWebMvc或直接扩展WebMvcConfigurationSupport将关闭WebMvcAutoConfiguration )。 我不确定替代方案是什么,因为a)我们需要autoconfig的“get-out”子句,以及b)我不认为Spring喜欢在同一个上下文中有两个WebMvcConfigurationSupports 。 很高兴在github上讨论,如果你想尝试找到一种方法来改变它(可能有一些中间立场)。

我设法自定义RequestMappingHandlerMapping同时使用BeanPostProcessor保持WebMvcAutoConfiguration

 @Configuration public class RequestMappingConfiguration { @Bean public RequestMappingHandlerMappingPostProcessor requestMappingHandlerMappingPostProcessor() { return new RequestMappingHandlerMappingPostProcessor(); } public static class RequestMappingHandlerMappingPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof RequestMappingHandlerMapping) { ((RequestMappingHandlerMapping) bean).setUseSuffixPatternMatch(false); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } } } 

如果Spring Boot提供了更好的方法来解决这个问题,我会很高兴…也许可以围绕PathMatchConfigurer做些什么?

DelegatingWebMvcConfiguration而不是WebMvcConfigurationSupport扩展,它不会阻止autoconfig发生:

 @Configuration public class WebConfig extends DelegatingWebMvcConfiguration { @Override public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping(); handlerMapping.setRemoveSemicolonContent(false); handlerMapping.setOrder(1); return handlerMapping; } } 

我认为现在在Spring Boot中执行此操作的最佳方法是将WebMvcRegistrations组件添加到您的上下文中 – 此问题在您的问题时不存在(自Spring Boot 1.4.0以来一直可用)。