Modification du répertoire de modèles Thymeleaf dans Spring Boot

1. Introduction

Thymeleaf est un moteur de modèle que nous pouvons utiliser pour nos applications Spring Boot. Comme pour beaucoup de choses, Spring Boot fournit un emplacement par défaut où il s'attend à trouver nos modèles .

Dans ce court didacticiel, nous allons voir comment nous pouvons modifier l'emplacement du modèle. Après cela, nous apprendrons à avoir plusieurs emplacements.

2. Configuration

Pour utiliser Thymeleaf, nous devons ajouter le démarreur Spring Boot approprié à notre pom.xml :

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

3. Modification de l'emplacement par défaut

Par défaut, Spring Boot recherche nos modèles dans src / main / resources / templates . Nous pouvons y mettre nos modèles et les organiser dans des sous-répertoires sans aucun problème.

Maintenant, imaginons que nous ayons une exigence que tous nos modèles résident dans un répertoire appelé templates-2 .

Créons un modèle pour dire bonjour et mettons-le dans src / main / resources / templates-2 :

    Enums in Thymeleaf   

Hello from 'templates/templates-2'

Nous aurons également besoin d'un contrôleur:

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

Avec cette configuration de base à l'écart, configurons Spring Boot pour utiliser notre répertoire templates-2 en remplaçant une propriété dans application.properties :

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

Maintenant, lorsque nous appelons notre HelloController , nous verrons notre message d'accueil de hello.html .

4. Utilisation de plusieurs emplacements

Maintenant que nous avons appris à modifier l'emplacement par défaut, voyons comment nous pouvons utiliser plusieurs emplacements de modèle.

Pour ce faire, créons 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; }

Dans notre bean personnalisé, nous définissons notre préfixe sur le répertoire de modèle secondaire que nous utilisons: templates-2. Nous définissons également l' indicateur CheckExistance sur true . C'est la clé pour permettre aux résolveurs d'opérer en chaîne.

Avec cette configuration, notre application peut utiliser des modèles du répertoire par défaut main / resources / templates et main / resources / templates-2 .

5. Erreurs

Lorsque nous travaillons avec Thymeleaf, nous pouvons voir cette erreur:

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

Nous voyons ce message lorsque Thymeleaf ne peut pas localiser le modèle pour une raison quelconque. Examinons quelques-unes des raisons possibles à cela et comment les résoudre.

5.1. Typo dans le contrôleur

Nous pouvons souvent voir cette erreur due à une simple faute de frappe. La première chose à vérifier est que notre nom de fichier moins l'extension et le modèle que nous demandons dans notre contrôleur correspondent exactement. Si nous utilisons des sous-répertoires, nous devons également nous assurer qu'ils sont corrects.

En outre, le problème peut être un problème avec certains systèmes d'exploitation. Windows n'est pas sensible à la casse, mais d'autres systèmes d'exploitation le sont. Nous devrions examiner cela si tout fonctionne correctement, par exemple, sur notre machine Windows locale, mais pas une fois que nous avons déployé.

5.2. Inclure l'extension de fichier dans le contrôleur

Étant donné que nos fichiers ont généralement une extension, il peut être naturel de les inclure lorsque nous renvoyons notre chemin de modèle dans le contrôleur. Thymeleaf ajoute automatiquement le suffixe, nous devons donc éviter de le fournir .

5.3. Ne pas utiliser l'emplacement par défaut

Nous verrons également cette erreur si nous avons placé nos modèles ailleurs que src / main / resources / templates . Si nous voulons utiliser un emplacement différent, nous devons soit définir la propriété spring.thymeleaf.prefix , soit créer notre propre bean ClassLoaderTemplateResolver pour gérer plusieurs emplacements.

6. Conclusion

Dans ce rapide tutoriel, nous avons découvert les emplacements des modèles Thymeleaf. Tout d'abord, nous avons vu comment changer l'emplacement par défaut en définissant une propriété. Ensuite, nous avons construit sur cela en créant notre propre ClassLoaderTemplateResolver pour utiliser plusieurs emplacements.

Nous avons terminé avec une discussion sur l'erreur que nous verrons quand Thymeleaf ne peut pas trouver nos modèles et comment la résoudre.

Comme toujours, l'exemple de code peut être trouvé sur GitHub.