You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Thymeleaf遍历含ArrayList的Map报错,如何正确取值?

问题分析与解决方案

错误原因

你的Map中每个value是**List<NomenclatureTypeFirst>类型**,但Thymeleaf代码里直接写${entry.value.detname},相当于试图调用ArrayList的detname属性——而ArrayList本身并没有这个属性,因此抛出找不到属性的错误。

另外需要确认:NomenclatureTypeFirst类的detname字段必须有public的getter方法(比如getDetname()),Thymeleaf是通过getter方法访问对象属性的,而非直接访问字段。


分场景解决

场景1:每个key对应的List仅包含一个元素

如果业务上能保证每个ids元素对应的List<NomenclatureTypeFirst>只有一个结果,有两种处理方式:

方式一:前端直接取List的第一个元素

修改Thymeleaf代码,通过索引获取List中的元素后再访问detname:

<table>
    <tr th:each="entry : ${map}">
        <td th:text="${entry.key}"></td>
        <!-- 取List的第一个元素访问detname,注意先判断非空避免索引越界 -->
        <td th:text="${!entry.value.isEmpty() ? entry.value[0].detname : ''}"></td>
    </tr>
</table>
方式二:后端直接存储单个对象而非List

如果后端能提前处理,把Map的value改为单个NomenclatureTypeFirst对象,前端原代码即可正常使用:

for(int i = 0; i < ids.size(); i++){
    List<NomenclatureTypeFirst> nmtfList = nomenclatureTypeFirstService.getAllByRequest(ids.get(i));
    // 非空时存储第一个元素
    if(!nmtfList.isEmpty()){
        map.put(ids.get(i), nmtfList.get(0));
    }
}

场景2:每个key对应的List包含多个元素,需全部展示

此时需要嵌套th:each,外层遍历Map的entry,内层遍历entry对应的List:

<table>
    <tr th:each="entry : ${map}">
        <td th:text="${entry.key}"></td>
        <td>
            <!-- 用逗号分隔多个detname -->
            <span th:each="nmtf, stat : ${entry.value}">
                <span th:text="${nmtf.detname}"></span>
                <span th:if="${!stat.last}">, </span>
            </span>
        </td>
    </tr>
</table>

也可以用换行、列表等形式展示多个元素,根据页面需求调整即可。

内容的提问来源于stack exchange,提问作者Augustine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:41:17