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

