Upgrading to Thymeleaf 3 and Reimplementing Rich HTML Email in Spring

I am transferring my project from Thymeleaf 2 to 3, and I am having a problem with the email template recognizer interfering with my website template converter.

When we first introduced Thymeleaf, we followed this document to use email templates and web templates and had no problems (section 4.2):

http://www.thymeleaf.org/doc/articles/springmail.html

During conversion in Thymeleaf 3, I only worked with one resolver template for HTML templates (using SpringResourceTemplateResolver), and the conversion was great. I managed to run the application without any problems, and all view templates are displayed without problems.

However, when you turn on the email template recognizer (using the ClassLoaderTemplateResolver class), the following error occurs when switching to any controller endpoint that returns a view:

java.io.FileNotFoundException: ClassLoader resource "thymeleaf/thymeleaf/login.html" does not exist

Indicates that it is trying to load a template from the ClassLoaderTemplateResolver class, not SpringResourceTemplateResolver. In Thymeleaf 2, setting the Order attribute solved this problem, but this does not seem to work in Thymeleaf 3.

I could not find any help in the Thymeleaf 3 documentation for having 2 template resolvers, as in the Thymeleaf 2 documents.

Any suggestions on how to get this work or documentation I could miss?

+4
source share
2 answers

(LoaderTemplateResolver SpringResourceTemplateResolver html-). , :

resolver.setCheckExistence(true);

, , spring , , , .

+3

..

AppConfig.java

@Configuration
@EnableWebMvc
@ComponentScan("myapp")
public class AppConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {

private ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) {
    this.applicationContext = applicationContext;
}

@Bean
public ViewResolver viewResolver() {
    ThymeleafViewResolver resolver = new ThymeleafViewResolver();
    resolver.setTemplateEngine(webTemplateEngine());
    resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());       
    return resolver;
}

@Bean
public TemplateEngine webTemplateEngine() {
    //this method must be defined as a bean otherwise i18n messages are not found       
    SpringTemplateEngine engine = new SpringTemplateEngine();

    engine.setEnableSpringELCompiler(true);
    engine.addTemplateResolver(webTemplateResolver());

    return engine;
}

private ITemplateResolver webTemplateResolver() {
    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("/WEB-INF/thymeleaf/");
    resolver.setTemplateMode(TemplateMode.HTML);
    resolver.setSuffix(".html");        
    resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
    return resolver;
}

@Bean
public TemplateEngine emailTemplateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(emailTemplateResolver());
    return templateEngine;
}

private ITemplateResolver emailTemplateResolver() {
    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("/WEB-INF/thymeleaf/email/");
    resolver.setTemplateMode(TemplateMode.HTML);
    resolver.setSuffix(".html");        
    resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
    return resolver;
}
}

, , emailTemplateEngine

@Autowired
private TemplateEngine emailTemplateEngine;
0

Source: https://habr.com/ru/post/1655318/


All Articles