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

Spring Boot Thymeleaf模板解析异常求助:模板文件找不到

Spring Boot整合Thymeleaf时模板文件找不到的解决方案

问题现象

整合Thymeleaf+Spring Context+flying-saucer-pdf生成PDF时,出现模板文件找不到的错误,错误日志如下:

2022-10-11T16:45:58.209+0700 ERROR [THYMELEAF][http-nio-8080-exec-2] Exception processing template "world-check-report": An error happened during template parsing (template: "applicationprocess/world-check-report.html")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "applicationprocess/world-check-report.html")
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:235) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:649) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) [thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1059) [thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1048) [thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at com.aeon.webadmin.controller.AssessmentController.getWorldCheckStatus(AssessmentController.java:820) [classes/:1.3.5]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_333]
Caused by: java.io.FileNotFoundException: ClassLoader resource "applicationprocess/world-check-report.html" could not be resolved
at org.thymeleaf.templateresource.ClassLoaderTemplateResource.reader(ClassLoaderTemplateResource.java:130) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]

相关代码

控制器代码

@PostMapping(value = "/world-check-info")
public ObjResponseEntity<AmlApplyLoan> getWorldCheckStatus(@RequestBody String aln_id) {
    try {
        HttpHeaders headers = new HttpHeaders();
        AssessmentController assessmentController = new AssessmentController();
        
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setPrefix("applicationprocess/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("XHTML");
        templateResolver.setCharacterEncoding("UTF-8");

        TemplateEngine templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);

        Context ctx = new Context();
        ctx.setVariable("message", "TESTING");
        
        // 解析时出错
        String htmtContent = templateEngine.process("world-check-report", ctx);
        
        return ObjResponseFactory.success();
        
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ObjResponseFactory.fail();
}

模板文件代码

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
  </head>
<body>
    <div class="content-wrapper" style="padding-left: 120px; font-family: sans-serif;">
        <h2 class="page_title" th:text="${message}"></h2>
        <h2>CASE REPORT</h2>    
    </div>
</body>
</html>

解决方案

  • 确认模板文件路径
    ClassLoaderTemplateResolver默认从classpath根目录加载资源,需确保模板文件放在src/main/resources/applicationprocess/下,编译后在target/classes/applicationprocess/中能找到world-check-report.html。若使用Thymeleaf默认路径,需将模板移至src/main/resources/templates/,并调整prefix为templates/applicationprocess/。

  • 使用Spring自动配置的TemplateEngine
    Spring Boot已自动配置TemplateEngine和TemplateResolver,无需手动实例化,直接注入即可避免路径配置错误。修改后的控制器代码:

    @RestController
    public class AssessmentController {
        
        @Autowired
        private TemplateEngine templateEngine;
        
        @PostMapping(value = "/world-check-info")
        public ObjResponseEntity<AmlApplyLoan> getWorldCheckStatus(@RequestBody String aln_id) {
            try {
                Context ctx = new Context();
                ctx.setVariable("message", "TESTING");
                
                // 若模板在templates/applicationprocess/下,路径为applicationprocess/world-check-report
                String htmlContent = templateEngine.process("applicationprocess/world-check-report", ctx);
                
                return ObjResponseFactory.success();
                
            } catch (Exception e) {
                e.printStackTrace();
            }
            return ObjResponseFactory.fail();
        }
    }
    
  • 修正手动配置的TemplateResolver
    若坚持手动配置,需确保prefix路径正确,可添加templateResolver.setCheckExistence(true);提前检查模板是否存在,便于调试:

    ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setPrefix("applicationprocess/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("XHTML");
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setCheckExistence(true); // 开启存在性检查
    
  • 检查文件名一致性
    确保文件名world-check-report.html拼写、大小写与代码中的调用完全一致,Linux环境下文件名区分大小写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:50:36