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
相关产品推荐
相关产品推荐

