SpringTemplateEngine.process 不读取文件 (thymeleaf)
SpringTemplateEngine.process doesn't read file (thymeleaf)
我正在尝试使用 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)
请注意,在您提到的示例中,正在创建一个名为 SpringTemplateEngine
的 bean,并将 SpringResourceTemplateResolver
注入其中。
您的代码没有使用创建的 bean
。相反,它创建了 SpringTemplateEngine
的新实例。我猜,这个新实例不知道 SpringResourceTemplateResolver。
两个可能的修正
- 自动装配 bean 而不是创建新实例
- 以与创建
bean
相同的方式创建此实例,即 addTemplateResolver
到新实例
我正在尝试使用 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)
请注意,在您提到的示例中,正在创建一个名为 SpringTemplateEngine
的 bean,并将 SpringResourceTemplateResolver
注入其中。
您的代码没有使用创建的 bean
。相反,它创建了 SpringTemplateEngine
的新实例。我猜,这个新实例不知道 SpringResourceTemplateResolver。
两个可能的修正
- 自动装配 bean 而不是创建新实例
- 以与创建
bean
相同的方式创建此实例,即addTemplateResolver
到新实例