升级到spring5.1.1之后静态资源404

spring


发表于 2018-11-21 11:57


升级到了spring 5.1.1之后,发现PathResource这个类已经被标记为过时了,官方推荐用FileSystemResource#FileSystemResource(Path)来取代它,但是当我把所有的PathResource都替换成为了FileSystemResource之后却发现,我的静态资源不能被正确的渲染了,都返回404状态。

spring静态资源的渲染是通过ResourceHttpRequestHandler这个类来控制的,而我是通过它的setLocations方法来设置静态文件的地址,那么就是将这里的PathResource替换为了FileSystemResource之后便无法找到静态文件了,ResourceHttpRequestHandler寻找文件的逻辑有点复杂,但能看到它最终依赖于 ResourceResolver这个来寻找,而如果不直接指定ResourceResolver的话,spring会自动创建一个PathResourceResolver

看了下PathResourceResolver的逻辑,最终确定文件的是ResourcecreateRelative这个方法,通过打印FileSystemResourcePathResourcecreateRelative的结果,终于看到了问题所在:

FileSystemResource fsr = new FileSystemResource(Path.of("f:/test"));
System.out.println(fsr.createRelative("abc/123"));

PathResource pr = new PathResource(Path.of("f:/test"));
System.out.println(pr.createRelative("abc/123"));

//output:
//file [f:\abc\123]
//path [f:\test\abc\123]

这个应该是spring5.1.1的一个bug,在5.1.2中还没有被修复


搜索