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

Spring中Thymeleaf非对象列表(数字/字符串)过滤方法咨询

解决Thymeleaf中基本类型列表的SpEL过滤问题

嘿,我之前也踩过这个坑!当你处理数字、字符串这类基本类型/包装类型列表时,直接写${numbers.?[>10]}确实不会生效——原因是SpEL需要明确知道你要比较的是当前迭代的元素本身,这时候就得用#this关键字来指代列表里的每一个元素。

正确的语法示例

1. 数字列表过滤

要筛选出大于10的数字,把表达式改成这样:

${numbers.?[#this > 10]}

比如后台传了List<Integer> numbers = Arrays.asList(3, 12, 9, 15, 7);,在Thymeleaf里遍历过滤后的结果:

<ul>
  <li th:each="num : ${numbers.?[#this > 10]}" th:text="${num}"></li>
</ul>

最终会渲染出12和15两个列表项。

2. 字符串列表过滤

如果是字符串列表,同样用#this来操作当前元素:

  • 筛选长度大于5的字符串:${strings.?[#this.length() > 5]}
  • 筛选包含特定子串的字符串:${strings.?[#this.contains('spring')]}
  • 筛选等于指定值的字符串:${strings.?[#this == 'thymeleaf']}

为什么之前的写法不生效?

对于对象列表(比如Person列表),我们用${persons.?[age >= 18]},这里的age是Person对象的属性,SpEL会自动把当前迭代的Person对象作为上下文,去取它的age属性。但对于基本类型列表,没有属性可以引用,必须显式用#this告诉SpEL:“我要比较的就是当前这个元素本身”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:17:29