【问题标题】:Thymeleaf templates does not resolve propertyThymeleaf 模板不解析属性
【发布时间】:2021-10-10 09:20:16
【问题描述】:

我需要使用 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>

我在“resources”文件夹中有我需要的每种语言的资源包消息。 如果您使用 ctrl+左键从我的 html 中检查#{TEST},您可以看到它看到了属性文件,因此 IDEA 可以解决它。

当我运行我的应用程序并尝试发送电子邮件时,我得到了下一个结果

??TEST_de??

对于其他所有语言,我得到了类似的结果。

如何解决这个问题?我需要 TemplateEngine 能够根据语言环境获得适当的属性值。

【问题讨论】:

  • 使用SpringTemplateEngine会自动获取基于Spring的MessageSource
  • SpringTemplateEngine 不是我的选择。当我尝试使用它时,在启动阶段的重定向操作中出现很多错误请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateInputException:解析模板时出错 [redirect],模板可能不存在或可能....
  • @M.Deinum 请将您的答案写成帖子。我会选择它作为答案。

标签: java spring thymeleaf


【解决方案1】:

在使用 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 更容易确定回调,如 ApplicationAwareMessageSourceAware 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 2013-10-04
    • 2019-02-20
    • 1970-01-01
    • 2016-12-21
    • 2021-11-05
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多