SpringTemplateEngine.process不读取文件(thymeleaf)

问题描述 投票:0回答:1

我正在尝试使用Thymeleaf模板引擎来创建一个html电子邮件,方法是关注this tutorial

我已经创建了模板配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.nio.charset.StandardCharsets;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;


@Configuration
public class ThymeleafTemplateConfiguration {
  @Bean
  public SpringTemplateEngine springTemplateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.addTemplateResolver(htmlTemplateResolver());
    return templateEngine;
  }

  @Bean
  public SpringResourceTemplateResolver htmlTemplateResolver(){
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setPrefix("/templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode(TemplateMode.HTML);
    templateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
    return templateResolver;
  }
}

和一个HTML模板:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <p>This is the body to be changed</p>
  <p>This is a name: ${name}</p>
</body>
</html>

然后我尝试填充模板:

templateEngine = new SpringTemplateEngine();
Context context = new Context();
context.setVariable("name", "my name");

String html = templateEngine.process("index", context);
System.out.println(html);

但是我没有获得填充的模板,而是获得了我投入的第一个参数:

>>> my name

我究竟做错了什么?为什么进程按原样获取参数而不是使用指定的前缀和后缀读取文件? (/templates/index.html)

java spring thymeleaf template-engine
1个回答
1
投票

请注意,在示例中,您提到正在创建一个名为SpringTemplateEngine的bean,并且正在向其中注入SpringResourceTemplateResolver

您的代码不会使用创建的bean。相反,它创建了SpringTemplateEngine的新实例。我的猜测,这个新实例不知道SpringResourceTemplateResolver。

两个可能的修复

  1. 自动装配bean而不是创建新实例
  2. 创建此实例的方法与创建bean(即addTemplateResolver)到新实例的方式相同
© www.soinside.com 2019 - 2024. All rights reserved.