【发布时间】:2014-10-16 11:19:33
【问题描述】:
我有这个速度模板:
<userTestData>
#foreach( $user in $userList )
<user>
<imsi>$user.imsi</imsi>
#foreach ( $subscriptionToGroupMap in $user.subscriptionToGroupsList )
<subscriptionToGroup>
#foreach ( $key in subscriptionToGroupMap.keySet() )
<$key>$subscriptionToGroupMap.get($key)</$key>
#end
</subscriptionToGroup>
#end
</user>
#end
</userTestData>
但在尝试时,我收到以下错误消息:
16:23:58,872 ERROR [org.jboss.as.ejb3.invocation] (http-/127.0.0.1:8080-1) JBAS014134: EJB Invocation failed on component ... for method public void ...) ...: javax.ejb.EJBException: org.apache.velocity.exception.ParseErrorException: Invalid arg #2 in directive #foreach at userTestDataTemplate.vm[line 10, column 21]
这基本上指向这一行:
#foreach ( $subscriptionToGroupMap in $user.subscriptionToGroupsList )
其余代码如下:
ArrayList userList = new ArrayList();
for(...) {
Map user = new HashMap();
user.put("imsi", i);
ArrayList subscriptionToGroupsList = new ArrayList();
Random rnd = new Random();
int numberOfSubscriptionsToGroups = (rnd.nextInt(1000) % (BucketType.values().length)) + 1;
LOG.log(Level.INFO, "...: numberOfSubscriptionsToGroups {0}", numberOfSubscriptionsToGroups);
for(int j = 0; j < numberOfSubscriptionsToGroups; j++) {
Map subscriptionToGroupMap = new HashMap();
subscriptionToGroupMap.put("name", ...);
subscriptionToGroupMap.put("priority", rnd.nextInt(Integer.MAX_VALUE) % (Integer.MAX_VALUE));
...
Date startDate = new Date(dateGeneratorHelper);
String stringFormattedStartDate = new SimpleDateFormat("dd-MM-yyyy'T'HH:mm:ss").format(startDate);
subscriptionToGroupMap.put("startDate", stringFormattedStartDate);
Date endDate = new Date(dateGeneratorHelper + dateGeneratorHelperHelper + 1);
String stringFormattedEndDate = new SimpleDateFormat("dd-MM-yyyy'T'HH:mm:ss").format(endDate);
subscriptionToGroupMap.put("endDate", stringFormattedEndDate);
subscriptionToGroupsList.add(subscriptionToGroupMap);
}
user.put("subscriptionToGroupsList", subscriptionToGroupsList);
userList.add(user);
}
String debugOutput = null;
for (Iterator it = userList.iterator(); it.hasNext();) {
HashMap userMap = (HashMap)it.next();
debugOutput += "\n" + userMap.get("imsi") + "\n";
ArrayList stgsList = (ArrayList)userMap.get("subscriptionToGroupsList");
for (Iterator jt = stgsList.iterator(); jt.hasNext();) {
Map stgMap = (HashMap)jt.next();
for (Iterator nt = stgMap.entrySet().iterator(); nt.hasNext();) {
Map.Entry<String, ArrayList> entry = (Map.Entry<String, ArrayList>)nt.next();
debugOutput += "\t<" + entry.getKey() + ">" + entry.getValue() + "</" + entry.getKey() + ">\n";
}
}
}
ServletContext servletContext = (ServletContext)webServiceContext.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
VelocityEngine ve = new VelocityEngine();
ve.setApplicationAttribute("javax.servlet.ServletContext", servletContext);
ve.setProperty("resource.loader", "webapp");
ve.setProperty("webapp.resource.loader.class", "org.apache.velocity.tools.view.servlet.WebappLoader");
ve.setProperty("webapp.resource.loader.path", "/WEB-INF/classes");
VelocityContext velocityContext = new VelocityContext();
velocityContext.put("userList", userList);
Template t = ve.getTemplate("userTestDataTemplate.vm");
StringWriter writer;
writer = new StringWriter();
t.merge(velocityContext, writer);
我从这段 Java 代码中得到了正确的调试输出,所以信息就在那里。
你知道为什么velocity不接受访问$user Map中的列表吗?
【问题讨论】:
-
是错字还是
#foreach ( $key in subscriptionToGroupMap.keySet() )处缺少$(应该是$subscriptionToGroupMap.keySet())? -
我不知道代码,所以我无法检查它,这会很尴尬,但同时也是一种解脱。所以你觉得代码没问题?
-
你应该可以使用
$user.get("subscriptionToGroupsList")对吧?
标签: java loops templates nested velocity