我需要使用 Thymeleaf 模板为不同区域设置发送电子邮件。
我的 HTML 中有下一部分
<p th:text="#{TEST}"></p>
我有下一个代码
Context context = new Context();
context.setLocale(Locale.GERMAN);
String emailBody = templateEngine.process( "WELCOME", context);
我有下一个豆子
@Bean
public TemplateEngine mailTemplateEngine() {
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.addTemplateResolver(mailTemplateResolver());
templateEngine.addDialect(new LayoutDialect());
templateEngine.setMessageResolver(messageResolver());
return templateEngine;
}
@Bean
public ITemplateResolver mailTemplateResolver() {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setPrefix("/templates/email/common/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCharacterEncoding(UTF_8.name());
templateResolver.setCheckExistence(true);
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
public IMessageResolver messageResolver() {
return new StandardMessageResolver();
}
我正在使用下一个依赖项
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
我在“资源”文件夹中为我需要的每种语言提供了资源包消息。 如果您使用 ctrl+左键单击从我的 html 中检查#{TEST},您可以看到它看到属性文件,因此 IDEA 可以解决它。
当我运行我的应用程序并尝试发送电子邮件时,我得到了下一个结果
??TEST_de??
对于其他所有语言,我都得到了类似的结果。
如何解决这个问题?我需要 TemplateEngine 能够根据区域设置获取正确的属性值。
使用 Spring 和 Thymeleaf 时,您可能最好使用提供 Spring 集成的 Thymeleaf 类。就像
SpringTemplateEngine
一样,它会自动与 Spring MessageSource
连接。
SpringResourceTemplateResolver
。
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
source.setBasename("classpath:/messages");
return source;
}
@Bean
public SpringTemplateEngine mailTemplateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.addTemplateResolver(mailTemplateResolver());
templateEngine.addDialect(new LayoutDialect());
return templateEngine;
}
@Bean
public SpringResourceTemplateResolver mailTemplateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setPrefix("classpath:/templates/email/common/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding(UTF_8.name());
templateResolver.setCheckExistence(true);
templateResolver.setCacheable(false);
return templateResolver;
}
专业提示: 使用 Java 配置时,请尝试在返回类型中尽可能具体,这使得 Spring 更容易确定诸如
ApplicationAware
、MessageSourceAware
等回调。
我遇到了同样的问题,解决方案只有这个bean,因为如果使用Spring Boot,标准消息解析器会被Spring更改为这个,请参阅日志:
[THYMELEAF] TEMPLATE ENGINE CONFIGURATION:
[THYMELEAF] * Thymeleaf version: 3.1.2.RELEASE (built 2023-07-30T19:25:50+0000)
[THYMELEAF] * Cache Manager implementation: org.thymeleaf.cache.StandardCacheManager
[THYMELEAF] * Template resolvers:
[THYMELEAF] * org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver
[THYMELEAF] * Message resolvers:
[THYMELEAF] * org.thymeleaf.spring6.messageresolver.SpringMessageResolver
所以这是一个
SpringMessageResolver
,而不是StandardMessageResolver
。所以这需要一个“messageSource”bean,它看起来像这样:
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("templates/messages");
return messageSource;
}
当然,现在您必须将消息包(
messages.properties
和/或messages_xy.properties
)放置在类路径中的模板下。