SpringBoot2.x中 WebMvcConfigurerAdapter 已过时,使用WebMvcConfigurationSupport 替换时自动配置失效。
Spring Boot的WebMvc自动配置失效了,我们访问不到静态资源(js,css等)了,然后查找资料发现,这是因为WebMvc的自动配置都在WebMvcAutoConfiguration类中,
(
    type = Type.SERVLET
)
({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
({WebMvcConfigurationSupport.class})
(-2147483638)
({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {但是类中有@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})这个注解,然而这个注解的意思是一旦在容器中检测到WebMvcConfigurationSupport这个类,WebMvcAutoConfiguration类中的配置就都不生效,只有在我们的的容器中没有这个组件的时候,自动配置类才会生效。
所以一旦我们自己写的配置类继承了WebMvcConfigurationSupport,就相当于我们的容器中已经导入了WebMvcConfigurationSupport这个组件,所以默认配置都不会生效,都得自己在配置文件中配置。
不想使WebMvc的自动配置失效,该怎么办呢?
我们可以实现WebMvcConfigurer接口,这个接口的方法都加了jdk1.8的 default方法修饰,不强制实现所有的方法,可以根据实际实现相关的方法
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
 
package org.springframework.web.servlet.config.annotation;
 
import java.util.List;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.lang.Nullable;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
 
public interface WebMvcConfigurer {
    default void configurePathMatch(PathMatchConfigurer configurer) {
    }
 
    default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    }
 
    default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    }
 
    default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    }
 
    default void addFormatters(FormatterRegistry registry) {
    }
 
    default void addInterceptors(InterceptorRegistry registry) {
    }
 
    default void addResourceHandlers(ResourceHandlerRegistry registry) {
    }
 
    default void addCorsMappings(CorsRegistry registry) {
    }
 
    default void addViewControllers(ViewControllerRegistry registry) {
    }
 
    default void configureViewResolvers(ViewResolverRegistry registry) {
    }
 
    default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    }
 
    default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
    }
 
    default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    }
 
    default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    }
 
    default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }
 
    default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }
 
    
    default Validator getValidator() {
        return null;
    }
 
    
    default MessageCodesResolver getMessageCodesResolver() {
        return null;
    }
}在SpringBoot2.0之后的版本中WebMvcConfigurerAdapter过时了,所以我们一般采用的是如下的两种的解决的方法。
(1)继承WebMvcConfigureSupport
 出现的问题:静态资源的访问的问题,在静态资源的访问的过程中,如果继承了WebMvconfigureSupport的方法的时候,SpringBoot中的自动的配置会失效。 @ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) 表示的是在WebMvcConfigurationSupport类被注册的时候,SpringBoot的自动的配置会失效,就需要你自己进行配置 我自己的代码
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //静态资源的映射
        System.out.println("配置了");
        registry.addResourceHandler("/")
                .addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }配置完成之后就会成功,但是在自己配置拦截器的时候对于相应的资源的拦截也要自己配置,十分的麻烦,所以这种方法是不推荐的。
(2)推荐的方法(实现一个WebMvcConfigurer接口)
 配置类如下:
public class MyMvcConfig implements WebMvcConfigurer {
    
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/index").setViewName("login");
        registry.addViewController("/main").setViewName("dashboard");
    }
    /**
     *配置拦截器
     * @param registry
     */
    
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
        .excludePathPatterns("/index","/","/user/login","/asserts/**","/webjars/**");
    }
//    @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        //静态资源的映射
//        System.out.println("配置了");
//        registry.addResourceHandler("/")
//                .addResourceLocations("classpath:/static/");
//        registry.addResourceHandler("/webjars/**")
//                .addResourceLocations("classpath:/META-INF/resources/webjars/");
//    }
    /**
     * 注意配置的方法的名字
     * @return
     */
    
    public MyLocaleResolver localeResolver() {
        return new MyLocaleResolver();
    }
}不用自己去配置静态资源的映射,配置拦截器的时候,只需要将自己的访问的静态的路径不让拦截器拦截即可.
                
                










