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

