Spring Boot中@Controller多层URL映射404,@RestController正常
解决Spring Boot非Thymeleaf项目多层URL映射HTML页面404问题
我来帮你梳理下这个问题的核心原因和解决方案哈~
首先,咱们得搞清楚为什么单层URL能正常工作,多层就不行:
- 当你用
@Controller返回字符串视图名时,没有模板引擎(比如Thymeleaf)的情况下,Spring会使用InternalResourceView做Servlet转发。 - 单层URL场景:比如映射
/hash返回hashcode.html,转发路径是相对于当前请求URI的,也就是会转发到/hashcode.html——这个路径刚好能被Spring的静态资源处理器匹配到(因为你的hashcode.html在static目录下),所以能正常访问。 - 多层URL场景:映射
/function/hash返回html/hashcode.html时,转发路径会变成/function/html/hashcode.html(相对当前请求路径拼接),而你的静态资源实际在/html/hashcode.html路径下,自然就返回404了。
而@RestController的多层URL能正常工作,是因为它直接返回响应体,不走视图转发流程,所以不受这个限制。
解决方案(选一个就行)
方案1:返回绝对路径视图名
直接在返回的视图名前加斜杠,让转发路径变成绝对路径,这样就不会和当前请求的URL层级拼接了:
@Controller @RequestMapping("/function") public class FunctionController { @RequestMapping("/hash") public String hashPage(Model m) { return "/html/hashcode.html"; // 前缀加斜杠,指定绝对路径 } }
方案2:配置视图解析器统一处理路径
如果有很多这类多层URL的需求,可以配置InternalResourceViewResolver,统一给视图名加上绝对路径前缀:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/"); // 设置绝对路径前缀 resolver.setSuffix(""); // 因为咱们返回的是完整文件名,后缀留空 return resolver; } }
配置后,你原来的代码return "html/hashcode.html"就会自动转换成/html/hashcode.html,转发到正确的静态资源路径。
额外检查点
别忘了确认你的静态资源位置是否正确:html/hashcode.html必须放在src/main/resources/static/html/目录下,这是Spring Boot默认的静态资源扫描目录哦~
内容的提问来源于stack exchange,提问作者Power_tile
相关产品推荐
相关产品推荐

