Thymeleaf th:if报EL1012E:Cannot index into a null value 校验不生效
问题根因
报错和校验逻辑失效是两个写法问题共同导致的:
- 表达式上下文不匹配:
th:text用*{...}选择语法,读取的是th:object绑定对象下的dataList属性;但th:if里写的是${...}全局语法,会直接从Model根域找dataList,根域没有这个属性时值为null,自然触发EL1012E: Cannot index into a null value报错,条件判断根本不会正常执行。 - 冗余的下标取值逻辑:
th:each已经迭代出了当前行的row对象,完全没必要再通过dataList[下标]回取属性,写法多余还容易踩上下文不匹配的坑。
修复代码
直接用迭代出的row对象读属性,统一表达式上下文即可:
<div class="mylist" th:each="row,rowStat : *{dataList}"> Folder: <span th:text="*{row.folderName}" /> <div class="invalid-feedback" th:if="*{row.folderName == appFolderName}"> Folder already exists. Please choose different folder name. </div> </div>
如果有特殊需求必须保留下标取值的写法,只要把th:if里的${...}改成*{...},和外层遍历的上下文保持一致就行:
<div class="invalid-feedback" th:if="*{dataList[__${rowStat.index}__].folderName == appFolderName}"> Folder already exists. Please choose different folder name. </div>
注意点
- Thymeleaf里
*{...}是基于th:object绑定的对象作为根节点解析属性,${...}是基于整个Model根上下文解析,二者查找路径不一样,混用时很容易出现空值问题。 th:each循环场景优先直接用声明好的迭代变量(比如示例里的row),写法更简洁,也不会出现下标越界、上下文不匹配的问题。
内容的提问来源于stack exchange,提问作者skdonthi
相关产品推荐
相关产品推荐

