如何在钥匙更换时访问Thymeleaf Spring方言中的地图?

时间:2015-04-20 18:27:56

标签: java spring thymeleaf spring-el

我正在使用Thymeleaf的Spring方言迭代一些数据,即使用SpEL。文档描述了如何使用数字或带引号的字符串访问数组,列表和地图:

<p th:text="${map['key']}"></p>
<p th:text="${list[0]}"></p>

但是,这里的键/索引必然是不变的,在这种情况下这对我没有帮助,因为我迭代了多个键(甚至不是字符串)。我尝试了两种变种:

<ul>
    <li th:each="key : ${map}">
//SpelParseException: EL1043E:(pos 41): Unexpected token. Expected 'rsquare(])' but was 'lcurly({)'
        <p th:text="${otherMap[${key}]}"></p>
//ConverterNotFoundException: No converter found capable of converting from type java.lang.String to type com.example.MyClass
        <p th:text="${otherMap[key]}"></p>
    </li>
</ul>

第二个让我相信SpEL试图在这里使用key作为字符串"key",但后来断言otherMap不使用字符串键。

有没有办法访问otherMap的元素?

2 个答案:

答案 0 :(得分:3)

注意

您必须使用双下划线 __${key}__对其进行预处理,并将其包含在下一级处理中。

<强>解决方案

这将解决您的问题

<li th:each="key : ${map}">
    <p th:text="${otherMap[__${key}__]}"></p>
</li>

鉴于您的控制器看起来像这样

@RequestMapping("/...")
public String index(Model model) {

    Map<String, String> otherMap = new HashMap<>();
    otherMap.put("one", "1111");
    otherMap.put("two", "2222");
    ....

    List<String> keys = new ArrayList<>();
    keys.add("one");
    keys.add("two");
    ...

    model.addAttribute("otherMap", otherMap);
    model.addAttribute("map", keys);

    return "<view name>";
}

答案 1 :(得分:2)

对我有用的语法是这样的(注意#th:object):

<ul>
    <li th:each="key : ${map}" th:object="${key}">
        <p th:text="${otherMap[#object]}"></p>
    </li>
</ul>

虽然SpEL尝试解析${otherMap[*{id}]}(当然不同,但我还是尝试过)作为乘法,但它正确地解释了#object符号。

据我所知,#object是Thymeleaf特有的,所以如果在SpEL的其他用例中存在类似的问题,那么这可能不适用。