Thymeleafで文字列をテンプレートとして処理する方法
Spring FrameworkでThymeleafをテンプレートエンジンとして使用している場合、HTMLファイルのリソースパスを指定して画面のレンダリングを行う使用方法が一般的です。
今回、文字列をそのままテンプレートとして処理する方法を書きます。
経緯
- ユーザーへメール通知を行う際、ソース内でメール本文を組み立てたくない。
- メール本文の修正の度にリリースが発生するため、テンプレートファイルをリソースディレクトリ内に持ちたくない。
- DB等に格納されたテンプレートを文字列としてThymeleafに渡したい。
方法
Thymeleaf 3.0.0 から文字列をそのままテンプレートとして使用できる StringTemplateResolver が用意されていました。
通常のリゾルバと異なる点は以下の通りです。
- 外部リソースにアクセスできない。 (ヘッダやフッタ等を共通パーツとして分割できない。)
- キャッシュがデフォルトで無効になっている。
設定
TemplateEngine に TemplateResolver が未設定だとデフォルトで StringTemplateResolver が使用されます。
したがって、以下のように簡潔に書くことができます。
@Bean
public SpringTemplateEngine stringTemplateEngine() {
return new SpringTemplateEngine();
}
実装
variables にテンプレート内で使用するためのオブジェクトをセットします。(Spring MVCの場合のModel相当です。)
@Autowired
@Qualifier("stringTemplateEngine")
private SpringTemplateEngine templateEngine;
public String renderTemplate() {
String template = "Hello, [[${name}]]!";
Map variables = new HashMap<>();
variables.put("name", "Taro");
Context context = new Context();
context.setVariables(variables);
return templateEngine.process(template, context);
}
テンプレート処理結果
Hello, Taro!
テキストの場合のテンプレートの書式は以下を参照してください。
Tutorial: Using Thymeleaf