无法使用列表映射的 freemarker 模板呈现 table

Unable to render a table using freemarker template for map of lists

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

下面是我的模型class:

@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>

说明

map.put("messages",map);

应替换为

map.put("messages",messageRequests);

并且在模型消息中将是一个列表,因此更改

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

进入

<#list messages as item>

你好,如果还没有读到这个,请写下这个例子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>