spring-boot - 在java中将复杂数据sendgrid转换成动态模板数据
问题描述
我正在使用最新版本的发送网格,我的小胡子模板在本地运行良好。我在发送网格上创建了一个动态模板,现在我需要在模板中发送一个复杂对象作为输入数据。
例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{#trueFlag}}
true flag :<p>{{orderId}}</p>
{{/trueFlag}}
-----
{{^falseFlag}}
false flag : <p>{{orderId}}</p>
{{/falseFlag}}
href
<a href="{{websiteUrl}}?">WeSome</a>
image
<img src="{{imageUrl}}" alt="{{imageAlt}}">
{{#features}}
{{.}}
{{/features}}
-----
feature
<p>{{feature.featureName}}</p>
<p>{{feature.featureType}}</p>
-----
{{#features}}
{{featureName}}
{{featureType}}
{{/features}}
-----------
<table>
<tr>
<th>Id</th>
<th>Name</th>
<th>Price</th>
</tr>
{{#features}}
<tr>
<td>{{featureName}}</td>
<td>{{featureType}}</td>
</tr>
{{/features}}
</table>
</body>
</html>
复杂对象是
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
@Data
public class TemplateObject {
private boolean trueFlag;
private boolean falseFlag;
private String orderId;
private String websiteUrl;
private String imageUrl;
private String imageAlt;
List<Feature> features;
Feature feature;
@Data
@AllArgsConstructor
public static class Feature {
String featureName;
String featureType;
}
}
从上述对象生成的 JSON 是
{
"trueFlag": true,
"falseFlag": false,
"orderId": "1",
"websiteUrl": "wesome.org",
"imageUrl": "http://s7d7.scene7.com/is/image/BedBathandBeyond/1565212198531p?$130$",
"imageAlt": "2Cuisinart® Replacement1 Charcoal Water Filters (Set of 2)",
"features": [
{
"featureName": "feature 2",
"featureType": "feature type 2"
},
{
"featureName": "feature 3",
"featureType": "feature type 3"
}
],
"feature": {
"featureName": "feature 1",
"featureType": "feature type 1"
}
}
这个 JSON 是正确的,我已经使用 web 应用程序上的发送网格测试 JSON 数据功能对其进行了验证。
现在我需要将这个复杂的对象传递给 SendGrid。
Mail mail = new Mail();
Email fromEmail = new Email();
fromEmail.setName("shri");
fromEmail.setEmail("shrikant.sharma606@gmail.com");
mail.setFrom(fromEmail);
mail.setTemplateId("d-xxxx");
Personalization personalization = new Personalization();
Gson gson = new Gson();
String s = gson.toJson(templateObject);
// if i paas data as individual key value its working
personalization.addDynamicTemplateData("imageUrl", "http://s7d7.scene7.com/is/image/BedBathandBeyond/1565212198531p?$130$");
// but i need to paas this object
personalization.addDynamicTemplateData("dynamic_template_data", s);
personalization.addTo(new Email("abcd@gmail.com"));
System.out.println(gson.toJson(personalization));
mail.addPersonalization(personalization);
解决方案
Twilio SendGrid 开发人员布道者在这里。
我不是 Java 开发人员,所以以前没见过这个,但是将这样的动态模板数据添加到电子邮件中似乎有点尴尬。
后面库中addDynamicTemplateData
的代码如下所示:
public void addDynamicTemplateData(String key, Object value) {
if (dynamicTemplateData == null) {
dynamicTemplateData = new HashMap<String, Object>();
}
dynamicTemplateData.put(key, value);
}
因此,它一次只接受一个密钥和数据。因此,您可以将对象添加到内部的一个键下的动态模板数据中,HashMap
并在整个模板中引用该键,或者遍历对象的键并将每个键和后续值添加到动态数据中。
在第一个选项中,不要序列化模板数据并使用单个键将其传递,例如“数据”到addDynamicTemplateData
personalization.addDynamicTemplateData("data", templateObject);
将发送到 API 的 JSON 对象将如下所示:
{
"data":
{
"trueFlag": true,
"falseFlag": false,
// etc...
}
}
并且您应该更新您的车把模板以使用“数据”的根。例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{#data.trueFlag}}
true flag :<p>{{data.orderId}}</p>
{{/data.trueFlag}}
或者,您可以遍历模板数据的键并将它们单独添加到动态数据中:
personalization.addDynamicTemplateData("trueFlag", templateObject.getTrueFlag());
personalization.addDynamicTemplateData("falseFlag", templateObject.getFalseFlag());
personalization.addDynamicTemplateData("orderId", templateObject.getOrderId());
personalization.addDynamicTemplateData("websiteUrl", templateObject.getWebsiteUrl());
personalization.addDynamicTemplateData("imageUrl", templateObject.getImageUrl());
personalization.addDynamicTemplateData("imageAlt", templateObject.getImageAlt());
personalization.addDynamicTemplateData("features", templateObject.getFeatures());
然后您可以保持车把模板相同。
Java SendGrid 库是开源的并且支持外部贡献。该addDynamicTemplateData
方法是通过这种方式贡献的。看起来好像有人建议实现了 asetDynamicTemplateData(Map<String, String> dynamicTemplateData)
方法(尽管它确实应该已经实现Map<String, Object>
),但似乎并没有进入最终实现。如果这样的东西有用,那么请在回购问题中提出建议。
推荐阅读
- java - 为执行自动化测试的每个测试类运行创建唯一用户
- c# - 读取富文本格式时的富文本框问题
- azure - Azure 容器处于已终止状态,但状态为正在运行
- reactjs - 使用 react-table + react-virtualized / react-window 无限加载
- eclipse - 从 Eclipse 本地终端打开文件
- node.js - 如何使用 Express.js 成功加载静态网站,无法 GET /index.html,错误
- r - 根据其他列查找列值的总和
- python - 视图完全呈现后如何在codeigniter中执行python
- avro - Avro Schema 不向后兼容
- sql - Google BigQuery SQL:根据另一列填写空白字段