TemplateProcessingException:嵌套变量、映射和 foreach 循环

TemplateProcessingException: Nested variables, map and foreach loop

我有以下型号,

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} 在模板中给出了类似的错误。

它应该是这样的:

<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['test'])一起使用。您的表达式既不是 - 对于解析器,您的字符串缺少包含引号。

其次,您滥用了 __${}__ 表达式。在定义 th:field 表达式时,您实际上只需要使用 __${}__ 即可。在大多数其他情况下,您应该可以在没有它们的情况下完成所有操作。