问题描述: 今天在使用
SpringBoot 2.x
更改其默认配置时,使用了下面的方式:
public class WebConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/goods/**").addResourceLocations("/templates/");
super.addResourceHandlers(registry);
}
}
即使用了WebMvcConfigurationSupport
作为辅助类自定义MVC的一些配置,发现默认的配置不生效了,即通过http://localhost:8080/brand.html
访问不到这个文件了:
排查了很久,原来当classpath中存在WebMvcConfigurationSupport 对象时,自动配置就不会生效:
这个注解的意思是在项目类路径中 缺少 WebMvcConfigurationSupport类型的bean时改自动配置类才会生效,所以继承 WebMvcConfigurationSupport 后需要自己再重写相应的方法。
如果想要使用自动配置生效,又要按自己的需要重写某些方法,比如增加 viewController ,则可以自己的配置类可以继承 WebMvcConfigurerAdapter 这个类。不过在spring5.0版本后这个类被丢弃了 WebMvcConfigurerAdapter ,虽然还可以用,但是看起来不好。Java 8以后接口可以有default
方法,因此直接实现WebMvcConfigurer接口就好(WebMvcConfigurerAdapter 存在意义就是为WebMvcConfigurer接口提供空实现)
例如我们还是为静态资源提供一个静态资源提供一个处理器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/goods/**").addResourceLocations("/goods/");
}
}
推荐阅读:
继承WebMvcConfigurationSupport后自动配置不生效及如何配置拦截器
WebMvcConfigurer 与 WebMvcConfigurationSupport 关系及避坑指南