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

