Thymeleaf动态注入内容报错:无法解析${content}片段
Thymeleaf布局扩展与动态内容注入问题解决
错误原因
你遇到的TemplateInputException是因为admin.html中的th:replace="${content}"里的${content}变量未被正确赋值,Thymeleaf无法找到对应的模板或片段。同时当前的模板引用逻辑倒置,子模板与布局模板的交互方式有误。
解决方案一:子模板直接扩展布局(推荐)
这种方式无需额外依赖,使用Thymeleaf原生片段机制实现布局复用:
1. 修正admin.html的布局结构
将admin.html中的内容占位区域改为空的可替换片段,移除动态变量引用:
<!-- Main Content --> <div class="col-md-9 col-lg-10"> <!-- 定义可被子模板替换的内容片段 --> <div th:fragment="content"></div> </div>
2. 修正main.html的模板引用逻辑
让main.html作为子模板,直接扩展admin.html布局并注入内容:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <!-- 替换admin布局中的body部分,同时注入自定义内容 --> <body th:replace="layouts/admin :: ~{::body}"> <!-- 此片段会替换admin中的content占位 --> <div th:fragment="content"> <div class="container"> <h1>Welcome to the Main Page</h1> <p>This is the Main Page content area. You can place your website's content here.</p> </div> </div> </body> </html>
3. 保持控制器逻辑不变
控制器返回admin/main/main即可,Thymeleaf会自动加载子模板并合并布局。
解决方案二:控制器动态传递内容片段(适合多场景动态切换)
如果你需要通过控制器动态指定要加载的内容片段,可按以下步骤修改:
1. 调整admin.html的内容区域
保留动态变量引用,无需定义额外片段:
<!-- Main Content --> <div class="col-md-9 col-lg-10"> <div th:replace="${content}"></div> </div>
2. 修改控制器代码,传入content变量
在控制器中指定要加载的片段路径,返回布局模板layouts/admin:
@Controller public class HomeController { @GetMapping("") public String getMethodName(Model model) { // 指定要注入的片段:模板路径 + 片段名称 model.addAttribute("content", "admin/main/main :: homecontent"); return "layouts/admin"; } @GetMapping("home") public String home(Model model) { model.addAttribute("content", "admin/home/home :: homecontent"); return "layouts/admin"; } }
3. 确保main.html中的片段名称正确
main.html中保留homecontent片段:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <body> <div th:fragment="homecontent"> <div class="container"> <h1>Welcome to the Main Page</h1> <p>This is the Main Page content area. You can place your website's content here.</p> </div> </div> </body> </html>
内容的提问来源于stack exchange,提问作者Shaik Ansar
相关产品推荐
相关产品推荐

