首页 > 解决方案 > Thymeleaf 嵌套对象迭代

问题描述

我正在尝试遍历包含另一个列表的列表。

@Entity
@Table(name = "session")
public class TrainingSession implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@OneToMany(cascade = CascadeType.ALL)
private List<ExerciseWrapper> exercises;

@Column
@DateTimeFormat(pattern = "YYYY/MM/DD")
private Date sessionDate;
}

将列表添加到模型中:

    @RequestMapping("/sessions")
public String getAllSession(Model model){
    List<TrainingSession> trainingSessionList = trainingSessionService.getAllTrainingSessions();
    model.addAttribute("sessionList", trainingSessionList);
    System.out.println(trainingSessionList);
    return PREFIX+"sessions";
}

迭代:

<th:block th:each="trainingSession : ${sessionList}">
<tr><td th:text="${trainingSession.id}"></td></tr>
<tr>
    <th:block th:each="exerciseWrapper : *{trainingSession.exercises}">
        <tr><td th:text="${exerciseWrapper.id}"></td></tr>
        <tr><td th:text="${exerciseWrapper.exercise.name}"></td></tr>
    </th:block>

</tr>

这会导致错误:

在 null 上找不到属性或字段“id”

如何访问练习列表?

标签: spring-bootthymeleaf

解决方案


问题在这里: *{trainingSession.exercises}。这里exerciseWrapper是 null 并且无法从 null 中找到 id。在这里你使用*而不是$

试试这个:

<th:block th:each="trainingSession : ${sessionList}">
<tr><td th:text="${trainingSession.id}"></td></tr>
<tr>
    <th:block th:each="exerciseWrapper : ${trainingSession.exercises}">
        <tr><td th:text="${exerciseWrapper.id}"></td></tr>
        <tr><td th:text="${exerciseWrapper.exercise.name}"></td></tr>
    </th:block>

</tr>

如果有可能 exerciseWrapper 为空,则添加th:if

使用空检查:

<th:block th:each="trainingSession : ${sessionList}">
<tr><td th:text="${trainingSession.id}"></td></tr>
<tr>
    <th:block th:each="exerciseWrapper : ${trainingSession.exercises}">
        <tr><td th:if="${exerciseWrapper!=null}" th:text="${exerciseWrapper.id}"></td></tr>
        <tr><td th:if="${exerciseWrapper!=null}" th:text="${exerciseWrapper.exercise.name}"></td></tr>
    </th:block>

</tr>

推荐阅读