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

Thymeleaf控制器渲染失败,切换注解后出现404问题排查

解决Spring Boot中Thymeleaf模板404但控制器已接收请求的问题

看起来你已经精准定位到了核心矛盾:控制器能正常处理请求(控制台有输出),但就是找不到Thymeleaf模板返回404。我帮你梳理几个最可能的原因和对应的解决办法:

1. 先修正Thymeleaf命名空间的错误

你的模板里的Thymeleaf命名空间写错了,这会影响模板的正常解析(虽然不一定直接导致404,但会引发后续渲染问题)。把模板开头的命名空间改成:

<html lang="en" xmlns:th="http://www.thymeleaf.org">

原来的http://www.w3.org/1999/xhtml是XHTML的命名空间,不是Thymeleaf的专属命名空间,必须替换成上面的地址。

2. 检查模板文件的打包情况

控制台能打印日志说明控制器逻辑没问题,但404意味着运行时找不到模板文件。你需要确认:

  • 执行./gradlew build后,解压build/libs下的jar包,查看BOOT-INF/classes/templates/目录下是否存在new-short-url-form.html
  • 如果文件不在那里,说明Gradle打包时没包含templates目录。可以在build.gradle里显式配置资源目录:
sourceSets {
    main {
        resources {
            srcDirs = ["src/main/resources"]
        }
    }
}

之后重新执行./gradlew clean build,确保模板被正确打包。

3. 确认Thymeleaf自动配置生效

检查你的Spring Boot启动类是否标注了@SpringBootApplication注解,这个注解会自动启用Thymeleaf的默认配置。另外,查看application.properties(或yml)里有没有禁用Thymeleaf的配置:

# 确保这个配置不存在或者值为true
spring.thymeleaf.enabled=true

如果不小心设置为false,Spring Boot就不会加载Thymeleaf视图解析器,自然找不到模板。

4. 显式配置Thymeleaf视图解析器路径

虽然Spring Boot默认会用classpath:/templates/作为前缀、.html作为后缀,但有时候自定义配置会覆盖默认值。可以在application.properties里显式声明:

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

这样确保视图解析器能精准定位到你的模板文件。

额外修正:表单绑定的错误

顺便提一下,你的模板和控制器的表单绑定有问题,现在的写法会导致渲染错误:

  • 控制器里你添加的model属性是longUrl(值为new String()),但模板里用了th:object="${String}",这是错误的,应该改成th:object="${longUrl}"
  • 另外,String类的属性是value,所以th:field应该写成*{value};更推荐你创建一个自定义的DTO类(比如UrlForm)来绑定表单,这样代码更清晰:
// 新建一个DTO类
public class UrlForm {
    private String longUrl;
    // getter和setter方法
}

控制器里改成:

model.addAttribute("urlForm", new UrlForm());

模板对应调整:

<form method="POST" th:action="@{/api/v1/create_short_url_thymeleaf}" th:object="${urlForm}">
    <h1>Enter a url to shorten</h1>
    <input type="text" id="longUrl" th:field="*{longUrl}"/>
</form>

注意th:action里最好加上你的@RequestMapping前缀/api/v1,避免路径匹配错误。

最后,执行./gradlew clean build清理缓存并重新构建,重启应用后再访问http://localhost:8080/api/v1/create_short_url试试,应该就能正常渲染页面了。

内容的提问来源于stack exchange,提问作者stk1234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:02:29