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

Spring Boot中Mustache邮件模板Include加载失败:Controller可用Service不行?

问题原因与解决方案

问题原因

Spring Boot作为视图使用Mustache模板时,其自动配置的MustacheAutoConfiguration已经完成了模板加载器与编译器的绑定逻辑——它会把MustacheResourceTemplateLoader注入到Mustache.Compiler实例中,让编译器能识别{{>header}}这类include指令,并通过加载器找到对应的子模板文件。

而你在MailService中仅通过Autowired获取MustacheResourceTemplateLoader加载主模板时,只是读取了TestMail.mustache的内容,但没有将该加载器关联到Mustache编译器上。当编译器遇到include指令时,因缺少模板加载逻辑的配置,就会抛出Template loading not configured异常。

解决方案

核心是让Mustache编译器知道使用MustacheResourceTemplateLoader来处理include的模板加载,有两种实现方式:

方式一:使用Spring自动配置好的Compiler(推荐)

直接注入Spring已经配置完成的Mustache.Compiler实例,它已经绑定了模板加载器:

@Service
class MailService(
    private val mustacheCompiler: Mustache.Compiler,
    private val templateLoader: MustacheResourceTemplateLoader
) {
    fun testMail() {
        // 通过编译器加载模板,自动处理include逻辑
        val template = mustacheCompiler.compile(templateLoader.getTemplate("TestMail.mustache"))
        val content = template.execute(mapOf()) // 传入模板所需数据
        // 后续邮件内容处理逻辑
    }
}

方式二:手动为编译器绑定加载器

如果需要自定义编译器配置,可手动将MustacheResourceTemplateLoader设置到编译器中:

@Service
class MailService(
    private val templateLoader: MustacheResourceTemplateLoader
) {
    fun testMail() {
        // 创建编译器并绑定加载器
        val compiler = Mustache.compiler().withLoader(templateLoader)
        val template = compiler.compile(templateLoader.getTemplate("TestMail.mustache"))
        val content = template.execute(mapOf())
        // 后续邮件内容处理逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:13:23