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
相关产品推荐
相关产品推荐

