最近尝试在一个springboot项目中直接访问静态资源时,如
http://localhost:8080/3.png
发现报了404错误,感觉很奇怪,在记忆中,只要把静态资源直接放到/static,/public,/resources,/templates下时,就可以象上面一样直接进行访问。
我尝试新建了一个项目,什么东西都不修改,只是简单地添加了spring-boot-starter-web模块,然后直接访问,发现成功了,那就是说我的记忆没啥大问题,我前一个项目肯定是修改了什么东西。
一开始我怀疑是jar包的问题,检查了很久,相关jar包删了加,加了删,问题没有解决,然后我想是不是过滤器的问题,把所有自定义的过滤器都去掉了,但还是老样子。
最后,因为WebMvcAutoConfiguration是SpringMVC的自动配置类,所以对其进行检查,发现WebMvcConfiguration中
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
意思是该配置在不存在WebMvcConfigurationSupport 类时生效
所以,静态资源访问失效的原因就是我在前一个项目中继承了WebMvcConfigurationSupport,导致了springboot中原本的静态资源映射失效了,所以,如果要解决这个问题,一是不再继承该类,这当然不太可能,二就是手动添加静态资源映射路径:
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/")
.addResourceLocations("classpath:/public/")
.addResourceLocations("classpath:/resources/")
.addResourceLocations("classpath:/templates/");
super.addResourceHandlers(registry);
}
这样,问题就解决了。
最后提一下,templates这个文件夹通常用于放置通过controller来进行跳转的页面,需要模块spring-boot-starter-thymeleaf的支持。。