我需要扩展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注释并运行自动配置类而没有任何问题?
提前致谢!
答案 0 :(得分:9)
从DelegatingWebMvcConfiguration
而非WebMvcConfigurationSupport
延伸,不会阻止自动配置发生:
@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration {
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
handlerMapping.setRemoveSemicolonContent(false);
handlerMapping.setOrder(1);
return handlerMapping;
}
}
答案 1 :(得分:8)
我设法自定义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
做些什么?
答案 2 :(得分:7)
您的分析是正确的(@EnableWebMvc
或直接延长WebMvcConfigurationSupport
会关闭WebMvcAutoConfiguration
)。我不确定替代方案是什么,因为a)我们需要autoconfig的“get-out”子句,而b)我不认为Spring喜欢在同一个上下文中有两个WebMvcConfigurationSupports
。很高兴在github上讨论,如果你想尝试找到改变它的方法(可能有一些中间立场)。
答案 3 :(得分:0)
我认为现在在Spring Boot中执行此操作的最佳方法是在您的上下文中添加WebMvcRegistrations
组件 - 在您提出问题时此解决方案不存在(自Spring Boot 1.4以来一直可用)。 0)。