Alterando o diretório de modelos Thymeleaf na inicialização do Spring

Alterando o diretório de modelos Thymeleaf na inicialização do Spring

1. Introdução

Thymeleaf é um mecanismo de template que podemos usar para nossoSpring Boot applications. Como acontece com muitas coisas,Spring Boot provides a default location where it expects to find our templates.

Neste breve tutorial, veremos como podemos alterar a localização do modelo. Depois de fazer isso, aprenderemos como ter vários locais.

2. Configuração

Para usar o Thymeleaf, precisamos adicionarappropriate Spring Boot starter ao nossopom.xml:


    org.springframework.boot
    spring-boot-starter-thymeleaf
    2.1.6.RELEASE

3. Alterando o local padrão

By default, Spring Boot looks for our templates in src/main/resources/templates. Podemos colocar nossos modelos lá e organizá-los em subdiretórios e não ter problemas.

Agora, vamos imaginar que temos um requisito de que todos os nossos modelos residam em um diretório chamadotemplates-2.

Vamos criar um modelo para dizer olá e colocá-lo emsrc/main/resources/templates-2:





Enums in Thymeleaf


    

Hello from 'templates/templates-2'

Também precisaremos de um controlador:

@GetMapping("/hello")
public String sayHello() {
    return "hello";
}

Com essa configuração básica fora do caminho, vamos configurar o Spring Boot para usar nosso diretóriotemplates-2 substituindo uma propriedade emapplication.properties:

spring.thymeleaf.prefix=classpath:/templates-2/

Agora, quando chamarmos nossoHelloController, veremos nossa saudação dehello.html.

4. Usando vários locais

Agora que aprendemos como alterar o local padrão, vamos ver como podemos usar vários locais de modelo.

Para fazer isso, vamos criar um beanClassLoaderTemplateResolver:

@Bean
public ClassLoaderTemplateResolver secondaryTemplateResolver() {
    ClassLoaderTemplateResolver secondaryTemplateResolver = new ClassLoaderTemplateResolver();
    secondaryTemplateResolver.setPrefix("templates-2/");
    secondaryTemplateResolver.setSuffix(".html");
    secondaryTemplateResolver.setTemplateMode(TemplateMode.HTML);
    secondaryTemplateResolver.setCharacterEncoding("UTF-8");
    secondaryTemplateResolver.setOrder(1);
    secondaryTemplateResolver.setCheckExistence(true);

    return secondaryTemplateResolver;
}

Em nosso bean personalizado, definimos nosso prefixo para o diretório de modelo secundário que estamos usando:templates-2. Também definimos o sinalizadorCheckExistance paratrue. Essa é a chave para permitir que os resolvedores operem em uma cadeia.

Com isso configurado, nosso aplicativo pode usar modelos do diretóriomain/resources/templatesemain/resources/templates-2 padrão.

5. Erros

Quando estamos trabalhando com o Thymeleaf, podemos ver este erro:

Error resolving template [hello], template might not exist or might not be accessible
  by any of the configured Template Resolvers

Vemos essa mensagem quando o Thymeleaf não pode localizar o modelo por algum motivo. Vejamos alguns dos possíveis motivos para isso e como corrigi-los.

5.1. Erro de digitação no controlador

Muitas vezes, podemos ver esse erro devido a um simples erro de digitação. A primeira coisa a verificar é se nosso nome de arquivo sem a extensão e o modelo que estamos pedindo em nosso controlador correspondem exatamente. Se estivermos usando subdiretórios, precisamos garantir que eles também estejam corretos.

Além disso, o problema pode ser um problema em determinados sistemas operacionais. O Windows não diferencia maiúsculas de minúsculas, mas outros sistemas operacionais. Devemos averiguar se tudo está funcionando bem, digamos, em nossa máquina Windows local, mas não após a implantação.

5.2. Incluindo a extensão de arquivo no controlador

Como nossos arquivos geralmente têm uma extensão, pode ser natural incluí-los quando retornarmos o caminho do modelo no controlador. Thymeleaf automatically appends the suffix, so we should avoid supplying it.

5.3. Não usando o local padrão

Também veremos esse erro se tivermos colocado nossos modelos em outro lugar que nãosrc/main/resources/templates. Se quisermos usar um local diferente, precisamos definir a propriedadespring.thymeleaf.prefix ou criar nosso próprio beanClassLoaderTemplateResolver para lidar com vários locais.

6. Conclusão

Neste tutorial rápido, aprendemos sobre os locais dos modelos do Thymeleaf. Primeiro, vimos como alterar o local padrão configurando uma propriedade. Em seguida, desenvolvemos isso criando nosso próprioClassLoaderTemplateResolver para usar vários locais.

Concluímos com uma discussão sobre o erro que veremos quando o Thymeleaf não conseguir encontrar nossos modelos e como resolvê-lo.

Como sempre, o código de exemplo pode ser encontrado emGitHub.