ぬまろぐ

←戻る

Spring Boot + Thymeleafで資材(jar)の外部にあるテンプレートを読み込む方法

2020/09/11

Thymeleafのテンプレートを資材(jar)の外に配置し、テンプレートを差し替えるだけで画面を更新できるようにしてみましたのでその方法を紹介します。

1. 資材内の別のテンプレートフォルダを追加する方法

まずは、資材の中で別のテンプレートフォルダを追加する方法です。 以下のコードのように、適当なクラスにClassLoaderTemplateResolverのBeanを定義すれば完了です。(サンプルではメインクラスに追加しています)

...
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    // 別のテンプレートフォルダを追加する
    @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(2); //読み込み順
        secondaryTemplateResolver.setCheckExistence(true);

        return secondaryTemplateResolver;
    }
}

2. 資材の外のテンプレートフォルダを追加する方法

資材(jar)の外のテンプレートフォルダを追加するには、以下のサンプルのようにFileTemplateResolverのBeanを定義します。

ただし、何も設定しないと起動時にテンプレートがキャッシュされ、ファイルを更新しても画面に反映されないためsetCacheTTLMsでキャッシュ時間を指定する必要があります。

サンプルだとキャッシュしてから10秒経過した後のリクエスト時にテンプレートファイルを再度読み込みなおし画面に変更が反映されます。

...
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    // 資材の外のテンプレートフォルダを追加する
    @Bean
    public FileTemplateResolver  thirdTemplateResolver() {
        FileTemplateResolver  thirdTemplateResolver = new FileTemplateResolver ();
        thirdTemplateResolver.setPrefix("C:\\xxx\\"); //フォルダパスを記載
        thirdTemplateResolver.setSuffix(".html");
        thirdTemplateResolver.setTemplateMode(TemplateMode.HTML);
        thirdTemplateResolver.setCharacterEncoding("UTF-8");
        thirdTemplateResolver.setOrder(3);
        thirdTemplateResolver.setCheckExistence(true);
        thirdTemplateResolver.setCacheTTLMs(10000L); //テンプレートのキャッシュ時間(ms)

        return thirdTemplateResolver;
    }
}