Search code examples
javaspringthymeleaf

Thymeleaf templates does not resolve property


I need to use Thymeleaf templates for email sending for different locales.

I have next part in my HTML

<p th:text="#{TEST}"></p>

I have next code

    Context context = new Context();
    context.setLocale(Locale.GERMAN);
    String emailBody = templateEngine.process( "WELCOME", context);

I have next beans

 @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();
}

I am using next dependencies

       <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>

I have resource bundle messages in "resources" folder for every language I need. And if you check #{TEST} from my html with ctrl+left click you can see that it sees property files, so IDEA can resolve it.

By when I am running my app and trying to send email I got next result

??TEST_de??

And I got similar result for every other language.

How to fix this ? I need TemplateEngine to be capable to get proper property value depending on locale.


Solution

  • When using Spring and Thymeleaf you are probably better of using the Thymeleaf classes that offer Spring integration. Like the SpringTemplateEngine, which will connect with a Spring MessageSource automatically.

    Now when using Spring you also might want to utilize the SpringResourceTemplateResolver as well.

    @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;
    }
    

    Pro Tip: When using Java config try to be as specific as possible in your return type, this makes it easier for Spring to determine callbacks like ApplicationAware, MessageSourceAware etc. etc.