Thymeleaf Map <string,object =“”>地图键

时间:2016-01-21 17:57:34

标签: java spring thymeleaf

我有Spring,Thymeleaf,HTML5网页。如果地图对象包含非英文字符,则有问题在Map中迭代。

  1. 设置所有字符编码过滤器/解析器/转换器并强制为UTF-8
  2. 假设我有以下设置:

    控制器:

    @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”和“”键。

    1. 我遇到以下异常:
    2. 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) 'Ā'

      1. 有趣的是 - 我在不同的页面上有几乎完全相同的设置(有点不同的mapDto结构和模板,但原理相同,页面标题相同),我没有相同的问题。
      2. 没有非英文字符键的地图的行为与预测的一致。
      3. 任何想法都存在问题?

        解决: 解决了使用双括号语法的问题 $ {{...}}
        它有一些局限性。但我能够解决它,它解决了我的主要问题。

1 个答案:

答案 0 :(得分:0)

mapDto.mapFoo[Ā].fooList[0].val

此表达式包含重音字符Ā。查看Tokenizer的源代码,重音符号被明确指示为标记化的无效候选者。

负责解析表达式的Spring EL InternalSpelExpressionParser与此Tokenizer紧密耦合,所以我认为没有开箱即用的方法来允许重音字符的标记化。我很确定有一个很好的理由为什么不允许这样做(例如它可能会破坏框架的其他部分)所以我建议你继续讨论框架要求的内容并删除表达式中的重音字符。