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

使用Thymeleaf+itest(html2pdf)转HTML为PDF时测试模板找不到问题

问题分析与解决方案

从错误栈信息可以看到核心问题:ClassLoader resource "classpath:templates/invoice_template" could not be resolved,结合你的配置和资源存放路径,问题出在模板解析器的路径配置逻辑和模板文件调用方式上,以下是针对性的解决步骤:

1. 修正ClassLoaderTemplateResolver的前缀配置

ClassLoaderTemplateResolver本身就是基于类加载器查找资源,不需要在prefix中添加classpath:前缀——这个前缀会被当作路径的一部分,导致实际查找路径变成classpath:templates/invoice_template,而类加载器只会从类路径根目录开始检索,因此需要去掉该前缀:

@BeforeEach
public void setUp() {
    ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    // 去掉classpath:前缀,直接从类路径下的templates目录开始查找
    templateResolver.setPrefix("templates/");
    // 添加模板后缀,避免调用时重复写扩展名
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("HTML");
    templateResolver.setCharacterEncoding("UTF-8");
    // 可选:显式绑定测试类的类加载器,避免类加载器差异问题
    templateResolver.setClassLoader(getClass().getClassLoader());
    
    TemplateEngine templateEngine = new TemplateEngine();
    templateEngine.setTemplateResolver(templateResolver);
    htmlGenerationService = new HtmlGenerationService(templateEngine);
}

2. 确保模板文件的完整名称与调用匹配

  • 确认你的模板文件是invoice_template.html(而非无扩展名的invoice_template),因为你设置了TemplateMode.HTML,Thymeleaf默认需要对应扩展名的文件。
  • 在HtmlGenerationService的generateHtml方法中,调用templateEngine.process()时,只需要传入模板名称invoice_template即可(因为已经通过setSuffix(".html")自动拼接扩展名):
// 示例:generateHtml方法中的调用逻辑
Context context = new Context();
// 设置模板变量...
return templateEngine.process("invoice_template", context);

3. 验证资源是否被正确打包到测试类路径

检查项目的target/test-classes/templates目录下是否存在invoice_template.html文件:

  • Maven/Gradle默认会将src/test/resources下的文件复制到target/test-classes,如果文件不存在,需要检查构建工具配置,确保resources目录被标记为资源目录。

4. 排查类加载器差异问题(可选)

如果上述步骤无效,可显式指定类加载器为测试类的类加载器,避免测试环境中类加载器上下文不一致的问题(已在步骤1的代码中添加)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:27:02