Spring Boot2.0 显式配置 @EnableWebMvc 并实现WebMvcConfigurer 接口导致静态资源访问404

本文目的:解决springboot2.x版本静态资源访问404问题,已解决如下!

SpringBoot 默认帮我们做了很多事情,这大大简化了我们的开发。 但有时候我们想要自己定义一些Handler,Interceptor,ViewResolver,MessageConverter

在Spring Boot 2.0之前版本都是靠重写 WebMvcConfigurerAdapter 的方法来添加自定义拦截器,消息转换器等。

SpringBoot 2.0 后,该类被标记为@Deprecated。现在,我们只能靠实现 WebMvcConfigurer 接口来实现了。

通过接口的方法查看,如下:

Spring Boot2.0 显式配置 @EnableWebMvc 并实现WebMvcConfigurer 接口导致静态资源访问404_第1张图片

所遇到的问题:假如在项目中显式使用了@EnableWebMvc,发现原来的放在 src/main/resources/static 目录下面的静态资源访问不到了。

静态资源存放位置如下:

Spring Boot2.0 显式配置 @EnableWebMvc 并实现WebMvcConfigurer 接口导致静态资源访问404_第2张图片

Spring Boot 默认为我们提供了静态资源处理,建议直接使用Spring Boot的默认配置即可。默认提供的静态资源映射如下:

  • classpath:/META-INF/resources
  • classpath:/resources
  • classpath:/static
  • classpath:/public

这些目录的静态资源可以直接访问到,上面这几个都是静态资源的映射路径

优先级顺序为:META-INF/resources > resources > static > public

但是配置 @EnableWebMvc 注解并实现 WebMvcConfigurer 接口之后,启动项目发现 css, js 等这些静态资源404了,网上搜集到的引起原因如下:

  1. 用户配置了@EnableWebMvc
  2. Spring扫描所有的注解,再从注解上扫描到@Import,把这些@Import引入的bean信息都缓存起来
  3. 在扫描到@EnableWebMvc时,通过@Import加入了 DelegatingWebMvcConfiguration,也就是WebMvcConfigurationSupport
  4. spring在处理@Conditional相关的注解,判断发现已有WebMvcConfigurationSupport,就跳过了spring bootr的WebMvcAutoConfiguration

所以spring boot自己的静态资源配置不生效。

解决方式为:

(一)注释或删除掉@EnableWebMvc注解

(二)配置静态资源访问代码(以下任意其一即可)

使用配置文件方式

spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

使用配置类方式


@Configuration
//@EnableWebMvc 这个注解需要注释掉!!!
public class WebMvcConfig implements WebMvcConfigurer {

	/**
	 * 配置静态资源的访问
	 * @param registry
	 */
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/**")
				.addResourceLocations("classpath:/resources/")
				.addResourceLocations("classpath:/static/")
				.addResourceLocations("classpath:/public/");
		WebMvcConfigurer.super.addResourceHandlers(registry);
	}
}

你可能感兴趣的:(springboot)