You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:52:32