2
votes

I'm migrating an existing application to Spring 5.0.0.M3 & Spring Boot 2.0.0.M3. With Spring Boot I'm also importing the Thymeleaf starter.

The application has 2 template folders mails and templates. If I specify the below configuration for email templates, the templates folder is ignored; e.g. I'm getting FileNotFoundException for templates in this folder.

@Configuration
public class ThymeleafConfiguration {

    @SuppressWarnings("unused")
    private final Logger log = LoggerFactory.getLogger(ThymeleafConfiguration.class);

    @Bean
    @Description("Thymeleaf template resolver serving HTML 5 emails")
    public ClassLoaderTemplateResolver emailTemplateResolver() {
        ClassLoaderTemplateResolver emailTemplateResolver = new ClassLoaderTemplateResolver();
        emailTemplateResolver.setPrefix("mails/");
        emailTemplateResolver.setSuffix(".html");
        emailTemplateResolver.setTemplateMode("HTML5");
        emailTemplateResolver.setCharacterEncoding(CharEncoding.UTF_8);
        emailTemplateResolver.setOrder(1);
        return emailTemplateResolver;
    }
}

I've tried setting the setOrder parameter to 2, 10, etc. which made no difference. If I remove the resolver method, the templates folder is recognized, but the mails folder isn't.

Any ideas what might be going on?

1

1 Answers

1
votes

What I understand is you have mails and templates sub-folders under the resources folder.

You can add resource folder as the prefix in your ClassLoaderTemplateResolver. Then add ResourceHandler for both mails and templates sub-folders.

ClassLoaderTemplateResolver

 @Bean
 @Description("Thymeleaf template resolver serving HTML 5 emails")
 public ClassLoaderTemplateResolver emailTemplateResolver() {
     ClassLoaderTemplateResolver emailTemplateResolver = new 
     ClassLoaderTemplateResolver();
     emailTemplateResolver.setPrefix("resources/");
     emailTemplateResolver.setSuffix(".html");
     emailTemplateResolver.setTemplateMode("HTML5");
     emailTemplateResolver.setCharacterEncoding(CharEncoding.UTF_8);
     emailTemplateResolver.setOrder(1);
     return emailTemplateResolver;
}

Place your ResourceHandler method in your application class, which your have annotated with @SpringBootApplication.

ResourceHandler

public void addResourceHandlers(ResourceHandlerRegistry registry) {
    if (!registry.hasMappingForPattern("/mails/**")) {
        registry.addResourceHandler("/mails/**").addResourceLocations("classpath:/resources/mails/");
    }
    if (!registry.hasMappingForPattern("/templates/**")) {
        registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/resources/templates/");
    }
}

When you return your view name from any method, it can be like:

return "mails/page1"; 

or

return "templates/page2";