首页 > 解决方案 > 在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);

标签: spring-bootsendgridsendgrid-api-v3sendgrid-templatessendgrid-api-v2

解决方案


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>),但似乎并没有进入最终实现。如果这样的东西有用,那么请在回购问题中提出建议。


推荐阅读