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 {