きっかけ
メール本文のテンプレートで、署名の部分もテンプレートにしていたが、署名と本文のそれぞれを変数解決させるという形にしてしまったので、署名テンプレートの解決を何度も呼び出すことに…
冷静に考えると、テンプレート内で他のテンプレートを呼び出す(テンプレートの再利用)機能が、たいがいにテンプレートエンジンにあるはずなので、それを使う形に修正してみた
使っているのはHandlebars.java です。
やり方
main.hbsとsign.hbsの二つのテンプレートがあって、signの部分を、テンプレートを解決するためのDTOを基底クラスに持たせるという作戦です。
main.hbs
{{user.name}} 様
{{greeting}}
{{item.name}} が {{item.rate}} % 割引中です。
{{> sign}} // これでsign.hbsを呼び出し
sign.hbs
株式会社 XXX
担当: {{contact.name}}
連絡先アドレス:{{contact.email}}
テンプレート用DTOの基底クラス
まずは署名の部分を解決できるように基底クラスを作ります
BaseTemplateDto.java
public abstract class BaseTemplateDto {
public final Contact contact
BaseTemplateDto(Contact contact) {
this.contact = contact;
}
}
テンプレート用DTO
次に、mail.hbsの変数を解決するためのDTOを、上記を継承して作成します。
MainTemplateDto.java
public class MainTemplateDto extends BaseTemplateDto {
public final User user;
public final String greeting;
public final Item item;
MainTemplateDto(User user, String greeting, Item item, Contact contact) {
// 基底クラスが持つ担当者情報をそのコンストラクタに渡す
super(contact);
/* 中略 */
}
}
あとはこのインスタンスをテンプレートの変数解決のメソッドに渡してやればOKです。
テンプレートの変数解決の詳細はこちら
結果はこんな感じになります。
ユーザ1 様
こんにちは
商品A が 10 % 割引中です。
株式会社 XXX
担当: 〇田△
連絡先アドレス:sample@example.com
定型文しかないフッターなどであれば、テンプレートにそれをべた書きして、それを呼び出すという形ももちろんできます。(公式サイトの例がもろにそれです。)