我有以下型号,
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}
会出现类似错误。
答案 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
。在大多数其他情况下,你应该能够在没有它们的情况下做任何事情。