无法使用列表映射的 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>
我有一个发送电子邮件的应用程序。我正在使用模板化的免费标记在电子邮件中呈现 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>