[英]Spring MVC - Thymeleaf form binding with an arraylist
从特定的角度来看,我确实有一个可扩展的员工列表。 每个员工都有2个字段,分别是hoursWorked
和advancePayments
。 单击1个按钮,我想发布整个表格。 为此,我向包含几个POJO(基于雇员数量)的视图发送了一个列表。
添加到列表中的POJO如下所示:
@Setter
@Getter
@NoArgsConstructor
public class WorkdayCommand {
private Long employeeId;
private Integer hoursWorked;
private Integer advancePayment;
}
在控制器中,我确实有一行将列表添加到模型中:
model.addAttribute("workdayCommands", employeeService.getListOfWorkdayCommandsWithIds());
并形成实际列表的方法:
public List<WorkdayCommand> getListOfWorkdayCommandsWithIds(){
List<WorkdayCommand> listOfCommands = new ArrayList<>();
List<Long> listOfIds = employeeRepository.getListOfIds();
for(int i = 0; i < employeeRepository.getNumberOfEmployees(); i++){
WorkdayCommand workdayCommand = new WorkdayCommand();
workdayCommand.setEmployeeId(listOfIds.get(i));
listOfCommands.add(workdayCommand);
}
return listOfCommands;
}
现在,我对自己的观点有疑问:
<div class="table-responsive" th:if="${not #lists.isEmpty(employees)}">
<form th:object="${workdayCommands}" th:action="@{/addworkday}">
some table headers...
<tr th:each="employee : ${employees}">
<td><a href="#" role="button" th:href="@{'/employee/' + ${employee.id}}" th:text="${employee.name}">Mike Kowalsky</a></td>
<td><input type="text" class="form-control" placeholder="Enter hours" th:field="*{hoursWorked}"></td>
<td><input type="text" class="form-control" placeholder="Enter payment" th:field="*{advancePayment}"></td>
<td><input type="hidden" th:field="*{id}"/></td>
</tr>
</form>
</div>
到目前为止,我一直遇到错误:
NotReadablePropertyException: Invalid property 'hoursWorked' of bean class [java.util.ArrayList]: Bean property 'hoursWorked' is not readable or has an invalid getter method
如何正确绑定arraylist与视图? 我想问题是在arraylist中没有这样的字段hoursWorked
。 我应该使用哪个th:field
参数来到达实际的WorkdayCommand.hoursWorked
字段,然后遍历列表以遍历所有员工? 如果您需要更多信息,请随时询问。
我正在尝试类似的事情:
th:field="*{[__${iter.index}__].hoursWorked}"
...但是那仍然行不通。 我不能与列表中的第一个POJO相关。
编辑2
在一个表格行中,我确实有一些员工信息以及2个输入和2个按钮。 由于以下原因而创建了每一行:
<tr th:each="employee : ${employees}">
单击提交按钮后,将创建一个新的Workday对象,然后将其持久保存到数据库中。 发生这种情况时,需要将工作日与相应的员工相关联。 所以与我:
<tr th:each="employee : ${employees}">
...我还分配了一个隐藏的id
字段。 然后,我们有WorkdayCommand
,它从视图中收集所有信息。 因此, employeeId
字段是我将工作日与相应员工相关联的方式。 它应该使用传递给每个显示所有信息的id
值。 希望现在清楚了。
您不能直接将th:object
绑定到ArrayList
。 相反,您应该创建一个具有ArrayList作为属性的对象。
@Setter
@Getter
@NoArgsConstructor
public class WorkdayForm {
private List<WorkdayCommand> workdayCommands = new ArrayList<>();
}
然后循环浏览,并像这样绑定它们:
<form th:object="${workdayForm}" th:action="@{/addworkday}">
<!-- table headers -->
<tr th:each="workdayCommand, i : ${workdayForm.workdayCommand}">
<td><input type="text" class="form-control" placeholder="Enter hours" th:field="*{workdayCommands[__${i.index}__].hoursWorked}"></td>
<td><input type="text" class="form-control" placeholder="Enter payment" th:field="*{workdayCommands[__${i.index}__].advancePayment}"></td>
<td><input type="hidden" th:field="*{workdayCommands[__${i.index}__].employeeId}"/></td>
</tr>
<!-- table footers -->
</form>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.