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

Spring Boot项目中如何在Thymeleaf遍历DTO内的List集合?

解决Thymeleaf无法遍历DTO中对象列表的问题

嘿,我猜你在Thymeleaf模板里遍历Form DTO中的Cities列表时卡壳了吧?我来帮你梳理几个最常见的排查点和解决办法:

1. 先确认DTO的Getter方法是否规范

Thymeleaf严格遵循JavaBean规范,它是通过Getter方法来访问对象属性的,所以首先要检查你的Form类里listOfCities的Getter是否正确:

public class Form {
    private SimpleModel simpleModel = new SimpleModel();
    private List<Cities> listOfCities;

    // 重点:Getter方法名必须是getListOfCities(首字母大写的ListOfCities)
    public List<Cities> getListOfCities() {
        return listOfCities;
    }

    public void setListOfCities(List<Cities> listOfCities) {
        this.listOfCities = listOfCities;
    }

    // SimpleModel的Getter/Setter也要确保存在,避免后续其他问题
    public SimpleModel getSimpleModel() {
        return simpleModel;
    }

    public void setSimpleModel(SimpleModel simpleModel) {
        this.simpleModel = simpleModel;
    }
}

要是Getter方法名写错(比如写成getListofCities),Thymeleaf根本找不到这个属性。

2. 检查控制器是否正确传入了模型属性

确保你的Spring控制器已经把填充好数据的Form对象放到了Model里,比如:

@Controller
public class CityController {

    @Autowired
    private CityRepository cityRepository;

    @GetMapping("/city-form")
    public String showCityForm(Model model) {
        Form form = new Form();
        // 从数据库获取Cities列表并设置到DTO中
        List<Cities> cities = cityRepository.findAll();
        form.setListOfCities(cities);
        // 把form对象存入Model,属性名是"form",后面模板要对应这个名字
        model.addAttribute("form", form);
        return "city-template";
    }
}

这里要注意:Model里的属性名(比如"form")必须和Thymeleaf模板里引用的完全一致。

3. Thymeleaf模板的遍历写法要正确

在模板里,你需要通过模型属性名找到Form对象,再遍历它的listOfCities列表,示例代码如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>城市列表</title>
</head>
<body>
    <h2>已加载的城市</h2>
    <!-- 先判断列表是否非空,避免空指针异常 -->
    <div th:if="${form.listOfCities != null and !form.listOfCities.isEmpty()}">
        <ul>
            <!-- 遍历form中的listOfCities,每个元素命名为city -->
            <li th:each="city : ${form.listOfCities}">
                <!-- 假设Cities实体有name和id属性,记得实体类要有对应的Getter -->
                <span th:text="${city.name}">默认城市名</span>
                <span th:text="| (ID: ${city.id}) |"></span>
            </li>
        </ul>
    </div>
    <!-- 列表为空时的提示 -->
    <div th:if="${form.listOfCities == null or form.listOfCities.isEmpty()}">
        暂无城市数据
    </div>
</body>
</html>

这里有几个关键点:

  • 必须在html标签里声明Thymeleaf命名空间xmlns:th="http://www.thymeleaf.org"
  • 遍历语法th:each="city : ${form.listOfCities}"中,form是控制器传入的模型属性名,listOfCities对应DTO的Getter方法名(去掉get后首字母小写)
  • 访问Cities实体的属性时,实体类必须有对应的Getter方法(比如getName()、getId())

4. 确认Cities实体类的Getter方法

你的Cities实体类要为视图中需要展示的属性提供Getter,比如:

@Entity
@Table(name="Cities")
public class Cities {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    // 其他属性...

    // 必须的Getter方法
    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    // Setter方法可选,但建议保留
    public void setId(Long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }
}

要是实体类没有对应的Getter,Thymeleaf会无法访问这些属性,显示空值或者报错。

5. 排查空指针问题

如果控制器里没有给form.setListOfCities()赋值,或者数据库查询返回了null,直接遍历会抛出空指针异常。所以模板里的th:if判断很重要,也可以在控制器里打印form.getListOfCities()的内容,确认列表是否真的有数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:41:12