百里香嵌套集<Object>
Thymeleaf nested Set<Object>
我在访问一组嵌套对象时遇到问题。
我定义了以下对象:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "site")
public class Site {
@Id
@GeneratedValue(strategy = GerationType.IDENTITY)
@Column(name="id", updatable=false,nullable=false)
private Long id;
private String siteName;
private String siteLocation;
@OneToMany(cascade=CascadeType.ALL, mappedBy = "site")
private Set<Rack> rack = new HashSet<>();
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "rack")
public class Rack {
@Id
@GeneratedValue(strategy = GerationType.IDENTITY)
@Column(name="id", updatable=false,nullable=false)
private Long id;
private String rackName;
private String rackAssetTag;
private String rackCMDBCode;
@ManyToOne
@JoinColumn(name = "site_id")
private Site site;
@OneToMany(cascade=CascadeType.ALL, mappedBy = "box")
private Set<Box> box = new HashSet<>();
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "box")
public class Box {
@Id
@GeneratedValue(strategy = GerationType.IDENTITY)
@Column(name="id", updatable=false,nullable=false)
private Long id;
private boxAssetTag;
private boxCMDBCode;
ManyToOne
@JoinColumn(name = "rack_id")
private Rack rack;
}
所有关系映射工作都非常出色。
问题是当我想为此创建一个漂亮的嵌套 table(css 格式和条件 thymeleaf 验证被删除,因为它是不相关的):
<div>
<table>
<thead>
<tr>
<th>Rack name</th>
<th>Rack asset tag</th>
<th>Rack CMDB code</th>
</tr>
</thead>
<tbody>
<tr th:each="rack:${site.rack}">
<td th:text="${rack.rackName}"></td>
<td th:text="${rack.rackAssetTag}"></td>
<td th:text="${rack.rackCMDBCode}"></td>
</tr>
<tr>
<td>
<table>
<thead>
<tr>
<th>Box asset tag</th>
<th>Box CMDB code</th>
</tr>
</thead>
<tbody>
<tr th:each="box:${rack.box}">
<td th:text="${box.boxAssetTag}">
<td th:text="${box.boxCMDBCode}">
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
控制器将一个对象 'site' 添加到包含所有关系的模型中。
访问我收到的页面时出现错误:
在 null
上找不到 属性 或字段 'box'
我认为当我移动到第二个 table 时,thymeleaf 会丢失在外部 table 中创建的对象架的上下文。因此,当我尝试在内部 table 中调用 th:each 时,没有机架对象来执行 ${rack.box}。
问题是如何在不丢失上面对象的上下文的情况下访问 thymeleaf 中的 'deeper' 对象?
此致,
杰瑞克
好的,我已经设法找到了解决方案。
我会写下来的。也许有一天会有人需要它。
所以我的想法是循环遍历每个对象,但在 body 元素上而不是在行上。这让您拥有更广泛的对象上下文
<div>
<table>
<thead>
<th>Rack name</th>
<th>Rack asset tag</th>
<th>Rack CMDB code</th>
</thead>
<tbody th:each="rack:${site.rack}">
<tr>
<td th:text="${rack.rackName}"></td>
<td th:text="${rack.rackAssetTag}"></td>
<td th:text="${rack.rackCMDBCode}"></td>
</tr>
<tr>
<td>
<table>
<thead>
<tr>
<th>Box asset tag</th>
<th>Box CMDB code</th>
</tr>
</thead>
<tbody>
<tr th:each="box:${rack.box}">
<td th:text="${box.boxAssetTag}">
<td th:text="${box.boxCMDBCode}">
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
我在访问一组嵌套对象时遇到问题。 我定义了以下对象:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "site")
public class Site {
@Id
@GeneratedValue(strategy = GerationType.IDENTITY)
@Column(name="id", updatable=false,nullable=false)
private Long id;
private String siteName;
private String siteLocation;
@OneToMany(cascade=CascadeType.ALL, mappedBy = "site")
private Set<Rack> rack = new HashSet<>();
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "rack")
public class Rack {
@Id
@GeneratedValue(strategy = GerationType.IDENTITY)
@Column(name="id", updatable=false,nullable=false)
private Long id;
private String rackName;
private String rackAssetTag;
private String rackCMDBCode;
@ManyToOne
@JoinColumn(name = "site_id")
private Site site;
@OneToMany(cascade=CascadeType.ALL, mappedBy = "box")
private Set<Box> box = new HashSet<>();
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "box")
public class Box {
@Id
@GeneratedValue(strategy = GerationType.IDENTITY)
@Column(name="id", updatable=false,nullable=false)
private Long id;
private boxAssetTag;
private boxCMDBCode;
ManyToOne
@JoinColumn(name = "rack_id")
private Rack rack;
}
所有关系映射工作都非常出色。 问题是当我想为此创建一个漂亮的嵌套 table(css 格式和条件 thymeleaf 验证被删除,因为它是不相关的):
<div>
<table>
<thead>
<tr>
<th>Rack name</th>
<th>Rack asset tag</th>
<th>Rack CMDB code</th>
</tr>
</thead>
<tbody>
<tr th:each="rack:${site.rack}">
<td th:text="${rack.rackName}"></td>
<td th:text="${rack.rackAssetTag}"></td>
<td th:text="${rack.rackCMDBCode}"></td>
</tr>
<tr>
<td>
<table>
<thead>
<tr>
<th>Box asset tag</th>
<th>Box CMDB code</th>
</tr>
</thead>
<tbody>
<tr th:each="box:${rack.box}">
<td th:text="${box.boxAssetTag}">
<td th:text="${box.boxCMDBCode}">
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
控制器将一个对象 'site' 添加到包含所有关系的模型中。 访问我收到的页面时出现错误: 在 null
上找不到 属性 或字段 'box'我认为当我移动到第二个 table 时,thymeleaf 会丢失在外部 table 中创建的对象架的上下文。因此,当我尝试在内部 table 中调用 th:each 时,没有机架对象来执行 ${rack.box}。 问题是如何在不丢失上面对象的上下文的情况下访问 thymeleaf 中的 'deeper' 对象?
此致, 杰瑞克
好的,我已经设法找到了解决方案。 我会写下来的。也许有一天会有人需要它。
所以我的想法是循环遍历每个对象,但在 body 元素上而不是在行上。这让您拥有更广泛的对象上下文
<div>
<table>
<thead>
<th>Rack name</th>
<th>Rack asset tag</th>
<th>Rack CMDB code</th>
</thead>
<tbody th:each="rack:${site.rack}">
<tr>
<td th:text="${rack.rackName}"></td>
<td th:text="${rack.rackAssetTag}"></td>
<td th:text="${rack.rackCMDBCode}"></td>
</tr>
<tr>
<td>
<table>
<thead>
<tr>
<th>Box asset tag</th>
<th>Box CMDB code</th>
</tr>
</thead>
<tbody>
<tr th:each="box:${rack.box}">
<td th:text="${box.boxAssetTag}">
<td th:text="${box.boxCMDBCode}">
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>