Thymeleaf嵌套对象迭代

时间:2018-08-11 11:49:20

标签: spring-boot 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>

这会导致错误:

  

找不到属性或字段“ id”为空

如何访问练习列表?

2 个答案:

答案 0 :(得分:0)

您应该首先检查是否从数据库中完全读取了信息。尝试调试模型中的内容。如果该位置已经为null,那就是Hibernate问题。

我认为您从第一次迭代中获得的对象包含一个包含null元素的列表。有关在Thymeleaf中处理null的问题,请检查以下问题:Using Thymeleaf when the value is null

答案 1 :(得分:0)

问题在这里:content = [' '.join(str(y) for y in x) for x in content] print (content) ['1 2 3', '1 2 3'] df = pd.DataFrame({'id': id, 'content': content}) print (df) id content 0 1 1 2 3 1 2 1 2 3 。这里*{trainingSession.exercises}为空,无法从空中找到ID。在这里,您使用exerciseWrapper而不是*

尝试一下:

$

如果exerciseWrapper可能为空,则添加<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检查:

th:if