消息模板 API
该扩展组件 API 的主要入口点是 MessageTemplatesGenerator
Spring bean。这个bean 提供了可以从模板生成消息的方法,并可以注入到服务或视图中。示例:
@Autowired
private MessageTemplatesGenerator messageTemplatesGenerator;
从模板生成消息
通过 generateMessage()
方法可以从模板生成消息。该方法需要两个参数:
-
模板编码:需要使用的模板的唯一编码。
-
参数的映射:传递一个
Map<String, Object>
包含需要插入模板的动态数据。
假设有一个模板的编码为 booking-confirmation
,其中有占位符为 {booking.title}
和 {booking.room}
。则可以按下面的方法生成消息:
Map<String, Object> params = new HashMap<>();
params.put("booking.title", "Conference Room Booking");
params.put("booking.room", "Room 101");
String message = messageTemplatesGenerator.generateMessage("booking-confirmation", params);
使用模板生成器
为了简化生成消息的过程,并且能重用模板或参数,扩展组件提供了 3 个特定的生成器。这些生成器可以组合多个模板和参数映射动态生成消息。下面是每个生成器的详细说明及用法。
SingleTemplateGenerator
SingleTemplateGenerator
基于单一模板和单一参数映射创建消息。可以用在需要使用特定模板和一组固定数据生成一条消息时。
用法示例:
messageTemplatesGenerator.generateSingleTemplate()
.withTemplateCode("my-template") (1)
.addParam("username", "admin") (2)
.addParam("firstName", "John")
.addParam("lastName", "Doe")
.generate(); (3)
1 | 指定模板编码 |
2 | 添加参数 |
3 | 生成消息 |
关键功能:
-
单一模板:仅使用一个模板生成消息。
-
单一参数映射:为模板设置一组参数映射。
-
输出:返回模板填充数据后的单一消息。
MultiTemplateGenerator
MultiTemplateGenerator
基于多个模板和单一参数映射创建消息。可以用在需要使用不同模板生成多个消息,但是却使用同一组数据时。
用法示例:
List<String> messages = messageTemplatesGenerator.generateMultiTemplate()
.withTemplateCodes("my-first-template", "my-second-template") (1)
.addParam("username", "admin") (2)
.addParam("firstName", "John")
.addParam("lastName", "Doe")
.generate(); (3)
1 | 指定多个模板编码 |
2 | 添加参数 |
3 | 生成多个消息 |
关键功能:
-
多模板:使用多个模板生成消息。
-
单一参数映射:为所有模板设置一组参数映射。
-
输出:返回消息列表,每条消息使用不同的模板生成,但是使用的是同一组参数。
并不是所有模板都需要使用参数映射中提供的每一个参数。一个完全有效的场景是,参数映射包含其中一个模板的某些参数,另一个模板的某些参数以及它们之间共享的一些参数。 每个模板只会提取并使用实际需要的参数。所提供的参数映射中的任何不需要的参数将被忽略。这样可以通过一次方法调用有效地从不同参数的多个模板生成消息。 |
如果模板包含参数映射中没有提供的参数,那么消息生成将会失败。但是这个行为可以通过预先对 FreeMarker 进行 配置 修改为能处理丢失的参数而不抛出异常。 |
MultiParamTemplateGenerator
MultiParamTemplateGenerator
基于单一模板和多组参数映射创建多个消息。可以用在需要使用同一个模板生成多个消息,但是却使用不同数据时。
用法示例:
List<String> messages = messageTemplatesGenerator.generateMultiParamTemplate()
.withTemplateCode("my-template") (1)
.addParams(Map.of( (2)
"username", "admin",
"firstName", "John",
"lastName", "Doe"
))
.addParams(Map.of( (3)
"username", "user",
"firstName", "Mary",
"lastName", "Smith"
))
.generate(); (4)
1 | 指定模板编码 |
2 | 添加第一组参数 |
3 | 添加第二组参数 |
4 | 生成多个消息 |
关键功能:
-
单一模板:仅使用一个模板生成消息。
-
多组参数映射:为同一模板设置多组参数映射。
-
输出:返回消息列表,每条消息使用相同的模板生成,但是参数不同。
使用 Freemarker 配置
消息模板扩展组件可对消息的生成过程进行自定义。为了进一步完善该过程,可以创建和使用自定义的 FreeMarker 配置。于是可以控制 FreeMarker 如何处理消息模板。下面是创建基本自定义配置的示例:
Configuration configuration =
new Configuration(messageTemplateProperties.getFreemarkerVersion());
configuration.setDefaultEncoding("UTF-8");
configuration.setDateFormat("yyyy, MM/dd"); (1)
List<String> messages = messageTemplatesGenerator.generateMultiTemplate()
.withTemplateCodes("booking-email-subject", "booking-email-body")
.withParams(
Map.of(
"booking", booking,
"today", new Date(),
"penalty", 5000
))
.withConfiguration(configuration) (2)
.generate();
1 | 配置 FreeMarker 模板引擎的特定版本、编码以及日期格式。 |
2 | 使用 MessageTemplatesGenerator 的流式接口应用我们创建的配置。 |