TemplateProcessingException:嵌套变量,map和foreach循环

时间:2017-04-03 09:52:18

标签: java-8 thymeleaf spark-java

我有以下型号,

public class Shift {
    private UUID id;
    private UUID unit;
    private List employees;
    private Timestamp startTime;
    private Timestamp endTime;

    ...
}

public class Unit {
    private UUID id;
    private String name;

    ...
}

以下路线,

path("/shift", () -> {
    get("", ShiftController.fetchShifts);
});

关注控制器,

public static Route fetchShifts = (Request req, Response res) -> {
    Map map = new HashMap<>();
    map.put("shifts", shiftDao.findAllByOrderByUnitAscStartTimeAsc());
    map.put("units", unitDao.findAllByOrderByName().stream().collect(Collectors.toMap(Unit::getId, u -> u)));
    return render(req, map, "shifts");
};

以下模板,

<table>
    <tbody>
        <tr th:each="s : ${shifts}">
            <td th:text="*{units[__${s.unit}__].name}">unit</td>
        </tr>
    </tbody>
</table>

给了我,

ERROR org.thymeleaf.TemplateEngine - [THYMELEAF][qtp1905797065-18] Exception processing template "shifts": Exception evaluating OGNL expression: "units[dd002ece-10c7-11e7-9009-93b58da4760f].name"
...
org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating OGNL expression: "units[dd002ece-10c7-11e7-9009-93b58da4760f].name"
...
Caused by: ognl.ExpressionSyntaxException: Malformed OGNL expression: units[dd002ece-10c7-11e7-9009-93b58da4760f].name [ognl.ParseException: Encountered "  "c7 ""
...

为了我的死,我无法弄清楚问题。我想要的是迭代所有的班次,找出每个班次的单位名称。为此,我在控制器中创建了一个地图units,其中包含代表它们的单位和对象的ID。但是,我在模板中实现地图失败了。模板中的*{units.get(__${s.unit}__).name}会出现类似错误。

1 个答案:

答案 0 :(得分:1)

它应该是这样的:

<table>
    <tbody>
        <tr th:each="s: ${shifts}">
            <td th:text="${units.get(s.unit).name}" />
        </tr>
    </tbody>
</table>

你的百里香有几个问题。

如错误消息所示,units[dd002ece-10c7-11e7-9009-93b58da4760f].name不是有效表达式。据我所知,你只能使用$ {map [index]}表达式和数字(看起来像map [0])和字符串(看起来像map [&#39; test&#39;])。你的表达式既不是 - 对于解析器,你有一个字符串缺少包含引号。

其次,您滥用__${}__表达式。在定义__${}__表达式时,您实际上只需要使用th:field。在大多数其他情况下,你应该能够在没有它们的情况下做任何事情。