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

Cor*_*mer 12 java spring spring-mvc spring-boot

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

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

我喜欢从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 {...}
Run Code Online (Sandbox Code Playgroud)

是否要加载WebMvcAutoConfiguration类而不必在该类中复制/粘贴大部分代码?

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

提前致谢!

pad*_*ilo 9

从而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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它忽略了我的自动配置......不确定它对其他人的工作方式 (2认同)

Rom*_* F. 8

我设法RequestMappingHandlerMapping在WebMvcAutoConfiguration使用BeanPostProcessor时自定义:

@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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我发现这个解决方案适用于应用程序中定义了SpringFox Swagger Docket的情况.使用DelegatingWebMvcConfiguration的上述解决方案会导致swagger doc显示失败. (2认同)

Dav*_*yer 7

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