Cambiar el directorio de plantillas de Thymeleaf en Spring Boot

1. Introducción

Thymeleaf es un motor de plantillas que podemos usar para nuestras aplicaciones Spring Boot. Como ocurre con muchas cosas, Spring Boot proporciona una ubicación predeterminada donde espera encontrar nuestras plantillas .

En este breve tutorial, veremos cómo podemos cambiar la ubicación de la plantilla. Después de hacer eso, aprenderemos cómo tener varias ubicaciones.

2. Configuración

Para usar Thymeleaf, necesitamos agregar el iniciador Spring Boot apropiado a nuestro pom.xml :

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

3. Cambio de la ubicación predeterminada

Por defecto, Spring Boot busca nuestras plantillas en src / main / resources / templates . Podemos poner nuestras plantillas allí y organizarlas en subdirectorios y no tenemos problemas.

Ahora, imaginemos que tenemos el requisito de que todas nuestras plantillas residan en un directorio llamado templates-2 .

Vamos a crear una plantilla para saludar y ponerla en src / main / resources / templates-2 :

    Enums in Thymeleaf   

Hello from 'templates/templates-2'

También necesitaremos un controlador:

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

Con esa configuración básica fuera del camino, configuremos Spring Boot para usar nuestro directorio templates-2 anulando una propiedad en application.properties :

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

Ahora, cuando llamemos a nuestro HelloController , veremos nuestro saludo de hello.html .

4. Uso de varias ubicaciones

Ahora que hemos aprendido cómo cambiar la ubicación predeterminada, veamos cómo podemos usar varias ubicaciones de plantilla.

Para hacer esto, creemos un bean ClassLoaderTemplateResolver :

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

En nuestro bean personalizado, establecemos nuestro prefijo en el directorio de plantillas secundario que estamos usando: templates-2. También establecemos el indicador CheckExistance en verdadero . Esta es la clave para permitir que los resolutores operen en cadena.

Con esta configuración, nuestra aplicación puede utilizar las plantillas del defecto recursos / / plantillas principal directorio y main / resources / templates-2 .

5. Errores

Cuando trabajamos con Thymeleaf, es posible que veamos este error:

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

Vemos este mensaje cuando Thymeleaf no puede localizar la plantilla por algún motivo. Veamos algunas de las posibles razones de esto y cómo solucionarlas.

5.1. Error tipográfico en el controlador

A menudo podemos ver este error debido a un simple error tipográfico. Lo primero que debemos verificar es que nuestro nombre de archivo menos la extensión y la plantilla que estamos solicitando en nuestro controlador coincidan exactamente. Si usamos subdirectorios, debemos asegurarnos de que también sean correctos.

Además, el problema puede ser un problema con ciertos sistemas operativos. Windows no distingue entre mayúsculas y minúsculas, pero otros sistemas operativos sí. Deberíamos investigar esto si todo está funcionando bien, digamos, en nuestra máquina Windows local, pero no una vez que lo hayamos implementado.

5.2. Incluir la extensión de archivo en el controlador

Dado que nuestros archivos suelen tener una extensión, puede ser natural incluirlos cuando devolvemos nuestra ruta de plantilla en el controlador. Thymeleaf agrega automáticamente el sufijo, por lo que debemos evitar proporcionarlo .

5.3. No usar la ubicación predeterminada

También veremos este error si hemos colocado nuestras plantillas en otro lugar que no sea src / main / resources / templates . Si queremos usar una ubicación diferente, necesitamos establecer la propiedad spring.thymeleaf.prefix o crear nuestro propio bean ClassLoaderTemplateResolver para manejar múltiples ubicaciones.

6. Conclusión

En este tutorial rápido, aprendimos sobre las ubicaciones de las plantillas de Thymeleaf. Primero, vimos cómo cambiar la ubicación predeterminada estableciendo una propiedad. Luego, nos basamos en eso creando nuestro propio ClassLoaderTemplateResolver para usar múltiples ubicaciones.

Terminamos con una discusión sobre el error que veremos cuando Thymeleaf no pueda encontrar nuestras plantillas y cómo resolverlo.

Como siempre, el código de ejemplo se puede encontrar en GitHub.