Thymeleaf 模板无法解析属性

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

我需要使用 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 能够根据区域设置获取正确的属性值。

java spring thymeleaf
2个回答
0
投票

使用 Spring 和 Thymeleaf 时,您可能最好使用提供 Spring 集成的 Thymeleaf 类。就像

SpringTemplateEngine
一样,它会自动与 Spring
MessageSource
连接。

现在使用 Spring 时,您可能还想利用

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
等回调。


0
投票

我遇到了同样的问题,解决方案只有这个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
)放置在类路径中的模板下。

© www.soinside.com 2019 - 2024. All rights reserved.