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
表达式时,您实际上只需要使用 __${}__
即可。在大多数其他情况下,您应该可以在没有它们的情况下完成所有操作。
我有以下型号,
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
表达式时,您实际上只需要使用 __${}__
即可。在大多数其他情况下,您应该可以在没有它们的情况下完成所有操作。