WebMvcConfigurerAdapter已過時
@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
/**
* {@inheritDoc}
* <p>This implementation is empty.
*/
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
}
新的實現是:
直接實現接口WebMvcConfigurer(推薦)
在jdk1.8后增加了default,接口中的方法不必被實現類全部實現,所以直接實現WebMvcConfigurer即可,無需通過抽象類WebMvcConfigurerAdapter來過渡。
@Configuration
public class WebMvcConfg implements WebMvcConfigurer {
//省略
}
或者繼承WebMvcConfigurationSupport
@Configuration
public class WebMvcConfg extends WebMvcConfigurationSupport {
//省略
}
但是用WebMvcConfigurationSupport會使靜態資源失效,靜態資源路徑找不到。
需要重寫addResourceHandlers()方法來手動映射路徑:
前面是請求路徑,后面是項目resources下的相對路徑
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
//classpath:可省略
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/ ");
}
原因:在WebMvcAutoConfiguration自動配置類的注解中,@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
的意思是,如果容器中沒有這個類,自動配置才生效;如果有,那么自動配置類就不生效了。
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {