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.