我有Spring,Thymeleaf,HTML5网页。如果地图对象包含非英文字符,则有问题在Map中迭代。
假设我有以下设置:
控制器:
@RequestMapping(value = "/app", method = { RequestMethod.GET, RequestMethod.POST })
public String view(ModelMap model, @RequestParam(value = "foo", required = false) Integer foo) {
MapDTO mapDto = new MapDTO();
Map<String, List<Foo>> mapFoo ... // populate map etc.
model.add("mapDto", mapDto.setMapFoo(mapFoo))
return foo == null ? VIEW : VIEW + " :: fooFragment"
}
用于测试目的的模板:
.. page ..
<div th:fragment="fooFragment" id="fooFragment">
..
<th:block th:each="fooMap : ${mapDto.mapFoo}">
<th:block th:each="item,row : ${fooMap.value.fooList}">
<p th:text="${item.val}"</p> <!-- working OK -->
<p th:text=" ${fooMap.value.fooList[__${row.index}__].idrValueName} "></p> <!-- working OK -->
<input th:field="*{mapDto.mapFoo[__${fooMap.key}__].fooList[__${row.index}__].val} "></p><!-- And this is working -->
<p th:text="${mapDto.mapFoo[__${fooMap.key}__].fooList[__${row.index}__].val} "></p><!-- FAILING ON THIS -->
</th:block>
</th:block>
..
</div>
.. rest of the page ..
让我说,我的地图上有“A”和“”键。
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "mapDto.mapFoo[Ā].fooList[0].val"
..
Caused by:
java.lang.IllegalStateException: Cannot handle (257) 'Ā'
任何想法都存在问题?
解决:
解决了使用双括号语法的问题
$ {{...}}
它有一些局限性。但我能够解决它,它解决了我的主要问题。
答案 0 :(得分:0)
mapDto.mapFoo[Ā].fooList[0].val
此表达式包含重音字符Ā
。查看Tokenizer的源代码,重音符号被明确指示为标记化的无效候选者。
负责解析表达式的Spring EL InternalSpelExpressionParser
与此Tokenizer
紧密耦合,所以我认为没有开箱即用的方法来允许重音字符的标记化。我很确定有一个很好的理由为什么不允许这样做(例如它可能会破坏框架的其他部分)所以我建议你继续讨论框架要求的内容并删除表达式中的重音字符。