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

Thymeleaf th:each在<form>元素失效,空集合抛SpEL异常求助

解决Thymeleaf中th:each在
元素上为空集合时的异常问题

这确实是Thymeleaf处理表单元素时的一个特殊行为,我来帮你拆解问题原因和可行的解决办法:

问题原因解析

当${items}是空集合/数组时:

  • 对于<div>这类普通块级元素,Thymeleaf会直接跳过整个th:each迭代逻辑,不会渲染该元素及其内部内容,自然不会触发对iterStat的访问。
  • 但对于<form>元素,Thymeleaf的表单处理逻辑会特殊对待:即使迭代源为空,它仍会尝试渲染一次<form>,但此时迭代状态变量iterStat并未被正确初始化(处于null状态),所以当你访问iterStat.size时,就会抛出org.springframework.expression.spel.SpelEvaluationException: EL1007E这个空指针类的异常。

可行的解决方案

1. 提前判断集合非空再渲染表单

用th:if配合Thymeleaf的集合工具类,先判断items是否为空,只有非空时才渲染带th:each的<form>:

<div th:if="${not #lists.isEmpty(items)}">
    <form th:each="item,iterStat : ${items}" > 
        <span th:text="${iterStat.size}"> Hello </span> 
    </form>
</div>

这样当items为空时,整个表单块都不会被渲染,从根源避免了异常。

2. 将th:each移到表单内部的元素上

把迭代逻辑从<form>本身移到内部的容器元素(比如<div>)上,这样即使items为空,<form>会正常渲染,但内部的迭代元素会被跳过:

<form>
    <div th:each="item,iterStat : ${items}" > 
        <span th:text="${iterStat.size}"> Hello </span> 
    </div>
</form>

这种方案适合需要保留<form>本身(哪怕没有迭代内容)的场景。

3. 给iterStat的访问添加空值保护

使用SpEL的Elvis运算符(?:)和安全导航运算符(?.),在iterStat为null时提供默认值,避免抛出异常:

<form th:each="item,iterStat : ${items}" > 
    <span th:text="${iterStat?.size ?: 0}"> Hello </span> 
</form>

iterStat?.size会在iterStat为null时返回null,?:0则会把默认值设为0,既不会报错,也能在空集合时显示合理的默认内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:26:25