Spring BootでのThymeleafテンプレートディレクトリの変更

1. 前書き

https://www.thymeleaf.org/[Thymeleaf]は、https://www.baeldung.com/spring-boot-crud-thymeleaf [Spring Boot applications]に使用できるテンプレートエンジンです。 多くの場合と同様に、* Spring Bootはテンプレートを見つけることができるデフォルトの場所を提供します*。
この短いチュートリアルでは、テンプレートの場所を変更する方法を見ていきます。 その後、複数の場所を持つ方法を学習します。

2. セットアップ

Thymeleafを使用するには、https://search.maven.org/search?q = a:spring-boot-starter-thymeleaf%20AND%20g:org.springframework.boot [appropriate Spring Boot starter]を追加する必要があります_pom.xml_:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <versionId>2.1.6.RELEASE</versionId>
</dependency>

3. デフォルトの場所の変更

*デフォルトでは、Spring Bootは_src / main / resources / templates_でテンプレートを探します。*テンプレートをそこに置いてサブディレクトリに整理することができ、問題はありません。
ここで、すべてのテンプレートが_templates-2_というディレクトリに存在するという要件があることを想像してみましょう。
挨拶用のテンプレートを作成して、_src / main / resources / templates-2_に配置しましょう。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Enums in Thymeleaf</title>
</head>
<body>
    <h2>Hello from 'templates/templates-2'</h2>
</body>
</html>
コントローラーも必要です。
@GetMapping("/hello")
public String sayHello() {
    return "hello";
}
この基本的なセットアップは完了です。_application.properties_のプロパティをオーバーライドして、Boot_templates-2_ディレクトリを使用するようにSpring Bootを設定しましょう。
spring.thymeleaf.prefix=classpath:/templates-2/
これで、_HelloController_を呼び出すと、_hello.html_からの挨拶が表示されます。

4. 複数の場所を使用する

デフォルトの場所を変更する方法を学習したので、複数のテンプレートの場所を使用する方法を見てみましょう。
これを行うには、_ClassLoaderTemplateResolver_ Beanを作成しましょう。
@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;
}
カスタムBeanでは、使用しているセカンダリテンプレートディレクトリにプレフィックスを設定します:_templates-2._また、_CheckExistance_フラグを_true_に設定します。 これは、リゾルバがチェーンで動作できるようにするための鍵です。
これを設定すると、アプリケーションはデフォルトの_main / resources / templates_ディレクトリと_main / resources / templates-2_のテンプレートを使用できます。

5. エラー

Thymeleafを使用しているときに、次のエラーが表示される場合があります。
Error resolving template [hello], template might not exist or might not be accessible
  by any of the configured Template Resolvers
このメッセージは、Thymeleafが何らかの理由でテンプレートを見つけられない場合に表示されます。 これについて考えられるいくつかの理由とそれらを修正する方法を見てみましょう。

5.1. コントローラーのタイプミス

このエラーは、単純なタイプミスが原因でよく見られます。 最初に確認することは、ファイル名から拡張子を除いたものと、コントローラーで要求しているテンプレートが正確に一致することです。 サブディレクトリを使用している場合、それらも正しいことを確認する必要があります。
さらに、問題は特定のオペレーティングシステムの問題である可能性があります。 Windowsは大文字と小文字を区別しませんが、他のオペレーティングシステムは区別します。 たとえば、ローカルのWindowsマシンですべてが正常に動作しているが、一度展開した後ではない場合、これを調べる必要があります。

5.2. コントローラーにファイル拡張子を含める

通常、ファイルには拡張子があるため、コントローラーでテンプレートパスを返すときにそれらを含めるのが自然な場合があります。 * Thymeleafは自動的にサフィックスを追加するため、指定しないでください*。

5.3. デフォルトの場所を使用しない

テンプレートを_src / main / resources / templates_以外の場所に配置した場合にも、このエラーが表示されます。 別の場所を使用する場合は、_spring.thymeleaf.prefix_プロパティを設定するか、独自の_ClassLoaderTemplateResolver_ Beanを作成して複数の場所を処理する必要があります。

6. 結論

このクイックチュートリアルでは、Thymeleafテンプレートの場所について学びました。 最初に、プロパティを設定してデフォルトの場所を変更する方法を見ました。 次に、独自の_ClassLoaderTemplateResolver_を作成して複数の場所を使用することにより、その上に構築しました。
最後に、Thymeleafがテンプレートを見つけられないときに表示されるエラーとその解決方法について説明しました。
いつものように、サンプルコードはhttps://github.com/eugenp/tutorials/tree/master/spring-thymeleaf-2[GitHub]で見つけることができます。