我正在尝试构建一个包含用户网格及其权限的页面。该项目是Spring MVC Boot + Thymeleaf项目。版本:
每个用户都有一个办公室和许多角色。 RoleDescription,Office和User是包含许多字符串的POJO。我在控制器中填写这样的数据。
@RequestMapping("/admin/users")
public String userGrid(Model model) {
MyWebServiceClient myClient = clientFactory.getClient();
List<RoleDescription> roles = myClient.getRoleList();
Map<String, Office> offices = myClient.getOfficeMap();
List<User> users = myClient.getUserRoleGrid();
model.addAttribute("offices", offices);
model.addAttribute("roles", roles);
model.addAttribute("users", users);
return "usergrid";
}
然后我在我的Thymeleaf模板化页面中显示数据:
<tbody th:each="user: ${users}" th:with="officeId=${user.officeId},office=${offices[officeId]}">
<tr>
<td th:text="${user.fullName}">Fred User</td>
<td th:text="${user.userId}">fred</td>
<td th:text="${office.name} (${officeId})">Madison, Wisconsin (madison)</td>
<th:block th:each="role: ${roles}">
<td th:text="${#lists.contains(user.roles, role)} ? 'yes'"></td>
</th:block>
</tr>
</tbody>
我尝试了offices[officeId]
的多种变体,试图从Map对象中检索办公室名称。没有th:with
语句的表达式的完整形式看起来像offices[user.officeId].name
。我已经倾倒了办公室地图,以确保它不是空的,并且它充满了数据。
无论我做什么,我都会得到一些变化:
org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "${office} (${officeId})"
只是评论:在与Freemarker合作了几年之后,这已经变得足够成熟,可以给你几乎非常有洞察力的错误信息,这非常令人讨厌。
答案 0 :(得分:0)
我不认为这里的问题是th:with
。实际上这是声明:<td th:text="${office.name} (${officeId})">Madison, Wisconsin (madison)</td>
与错误消息匹配。我建议将其更改为类似的东西来修复它/使其更具可读性:
<td>
<span th:text="${office.name}" /> (<span th:text="${officeId}" />)
</td>
或保留原始语法
<td th:text="${office.name + ' (' + officeId + ')'}">Madison, Wisconsin (madison)</td>