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

2022-09-03 05:21:27

我需要扩展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注释并运行自动配置类而不会出现任何问题?

提前致谢!


答案 1

从 扩展而不是 ,它不会阻止自动配置的发生:DelegatingWebMvcConfigurationWebMvcConfigurationSupport

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

答案 2

我设法自定义了,同时继续使用BeanPostProcessor:RequestMappingHandlerMappingWebMvcAutoConfiguration

@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


推荐