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

