Thymeleaf映射语法导致TemplateProcessingException

时间:2017-05-10 19:38:44

标签: spring-mvc thymeleaf

我正在尝试构建一个包含用户网格及其权限的页面。该项目是Spring MVC Boot + Thymeleaf项目。版本:

  1. Thymeleaf 3.0.3
  2. Thymeleaf Layout Dialect 2.2.1
  3. Spring Boot 1.5.2 (注意我必须覆盖Spring Boot' Thymeleaf版本,因为 布局方言版本已经过时了。)
  4. 每个用户都有一个办公室和许多角色。 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合作了几年之后,这已经变得足够成熟,可以给你几乎非常有洞察力的错误信息,这非常令人讨厌。

1 个答案:

答案 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>