【问题标题】:Unable to render a table using freemarker template for map of lists无法使用 freemarker 模板为列表映射呈现表格
【发布时间】:2021-08-05 21:47:34
【问题描述】:

我有一个发送电子邮件的应用程序。我正在使用模板化的免费标记在电子邮件中呈现表格。 但是我得到“freemarker.core.NonSequenceOrCollectionException:您尝试列出的值是extended_hash(包装器:ftSimpleHash),因此您必须在“as”之后指定两个循环变量;一个用于键,另一个用于值, 像 )。”异常

下面是我的模型类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MessageRequest {
    private String centerId;
    private String name;
    private String pincode;
    private String vaccine;
    private String fee;
    private String available_capacity;
    private String date;
}

以下是我的服务电话:

public MailResponse sendEmail() {
        List<MessageRequest> messageRequests = new ArrayList<>();
        messageRequests.add(new MessageRequest("test id","test name","000001","covaxin","free","100" , DateUtil.getTodayDate()));
        MailRequest mailRequest = new MailRequest();
        mailRequest.setFrom("electrode.1990@gmail.com");
        mailRequest.setName("manjosh");
        mailRequest.setToArr(new String[]{"email@gmail.com"});
        mailRequest.setSubject("Test email from vaccine slot tracker app");
        Map<String,Object> map = new HashMap<>();
        map.put("messages",map);
        map.put("test",map);
        return sendEmail(mailRequest,map);
    }
public MailResponse sendEmail(MailRequest request, Map<String, Object> model) {
        MailResponse response = new MailResponse();
        MimeMessage message = sender.createMimeMessage();
        try {
            // set mediaType
            MimeMessageHelper helper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED,
                    StandardCharsets.UTF_8.name());
            Template t = config.getTemplate("email-template.ftl");
            String html = FreeMarkerTemplateUtils.processTemplateIntoString(t, model);
            helper.setTo(request.getToArr());
            helper.setText(html, true);
            helper.setSubject(request.getSubject());
            helper.setFrom(request.getFrom());
            sender.send(message);
            response.setMessage("mail send to : " + Arrays.stream(request.getToArr()).sequential());
            response.setStatus(Boolean.TRUE);
        }catch (MessagingException | IOException | TemplateException e) {
            response.setMessage("Mail Sending failure : "+e.getMessage());
            response.setStatus(Boolean.FALSE);
        }
        return response;
    }

我的模板是:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Vaccine availability tracker</title>
</head>

<body>
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
            <td align="center" valign="top"
                style="background-color: #F0F8FF;"><br> <br>
                <table width="600" border="0" cellspacing="0" cellpadding="0">
                <tr class="tableHeader">
                        <td>Center Id</td>
                        <td>Center name</td>
                        <td>Area Pincode</td>
                        <td>Vaccine</td>
                        <td>Vaccine fee</td>
                        <td>Available capacity</td>
                        <td>Date</td>
                    </tr>
                         <#list messages as key, value>
                            <#list value as item>
                             <tr class="tableBody">
                                 <td>${item.centerId}</td>
                                 <td>${item}</td>
                                 <td>${item.name}</td>
                                 <td>${item.pincode}</td>
                                 <td>${item.vaccine}</td>
                                 <td>${item.fee}</td>
                                 <td>${item.date}</td>
                                </tr>
                            </#list>
                            </#list>
            </table> <br> <br></td>
        </tr>
    </table>
</body>
</html>

【问题讨论】:

    标签: java spring-boot freemarker


    【解决方案1】:

    指令

    map.put("消息",map);

    应该替换为

    map.put("messages",messageRequests);

    模型中的消息将是一个列表,因此请更改

    <#list messages as key, value>
           <#list value as item>
    

    进入

    <#list messages as item>
    

    【讨论】:

      【解决方案2】:

      你好,使用这个例子写,如果还没有读到,请写https://freemarker.apache.org/docs/ref_builtins_expert.html#ref_buitin_api_and_has_api

      <#list messages?keys as groupKey>
         ${groupKey}
           <#list groups.get(groupKey) as item>
               <tr class="tableBody">
                     <td>${item.centerId}</td>
                     <td>${item}</td>
                     <td>${item.name}</td>
                     <td>${item.pincode}</td>
                     <td>${item.vaccine}</td>
                     <td>${item.fee}</td>
                     <td>${item.date}</td>
                </tr>
         </#list>
      </#list>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-08
        • 2012-06-25
        • 2018-11-15
        • 2016-12-06
        • 2014-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多