java - Thymeleaf Map<String, Object> 迭代和映射键中的非英语字符

标签 java spring thymeleaf

我有 Spring、Thymeleaf、HTML5 网页。如果 map 对象包含非英语字符,则迭代 Map 时会出现问题。

  1. 所有字符编码过滤器/解析器/转换器均已设置并强制为 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/

    相关文章:

    Java 循环或数组

    java - Spring Framework 在 RuntimeException 中包装检查异常

    java - 在 weblogic 12c 上部署时创建 Azure 存储容器失败

    Spring Boot Thymeleaf 无法解析为带有 url 的表达式

    html - Thymeleaf 问题 css?

    java - 我想从 ListView 中删除一个项目

    java - 如何使用 javax.xml.parsers.DocumentBuilder 只读取 xml 文件的一部分?

    java - Libgdx 创建图像缩略图

    spring - JPA 和 Hibernate Cascade DELETE OneToMany 不起作用

    java - 替换片段时解析 thymeleaf 模板时出错