我有 Spring、Thymeleaf、HTML5 网页。如果 map 对象包含非英语字符,则迭代 Map 时会出现问题。
- 所有字符编码过滤器/解析器/转换器均已设置并强制为 UTF-8
假设我有以下设置:
Controller :
@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”和“Ā”键的 map 。
- 我遇到以下异常:
org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateProcessingException:评估 SpringEL 表达式的异常:“mapDto.mapFoo[Ā].fooList[0].val”
..
造成原因:
java.lang.IllegalStateException:无法处理(257)'Ā'
- 有趣的是 - 我在不同页面上有几乎完全相同的设置(mapDto 结构和模板略有不同,但原理相同,页面标题相同),而且我没有遇到相同的问题。
- 没有包含非英语字符的键的 map 的行为与预测一致。
有什么想法问题出在哪里吗?
已解决:
使用双括号语法解决了所描述的问题
${{...}}
它有一些限制。但我能够解决它们,它解决了我的主要问题。
最佳答案
mapDto.mapFoo[Ā].fooList[0].val
该表达式包含重音字符Ā
。查看Tokenizer的源码,重音字符被明确指示为标记化的无效候选者。
Spring EL InternalSpelExpressionParser
负责解析表达式的代码与此 Tokenizer 紧密耦合,因此我认为没有一种现成的方法可以允许对重音字符进行标记。我很确定这是不允许的(例如,它可能会破坏框架的其他部分),因此我建议您遵循框架的要求并删除表达式中的重音字符。
关于java - Thymeleaf Map<String, Object> 迭代和映射键中的非英语字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34930963/