Spring MVC - Thymeleaf形式与arraylist绑定

时间:2018-03-13 14:06:37

标签: java spring spring-mvc thymeleaf

在特定视图中,我有一个可扩展的员工列表。每位员工都有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

我的完整视图如下所示: enter image description here

在单个表格行中,我确实有一些员工信息以及2个输入和2个按钮。每行都是通过以下方式创建的:

 <tr th:each="employee : ${employees}">

当点击提交按钮时,会创建一个新的Workday对象,然后将其保留到数据库中。发生这种情况时,工作日需要与相应的员工相关联。所以我的:

 <tr th:each="employee : ${employees}">

...我还指定了隐藏的id字段。然后我们有WorkdayCommand从视图中收集所有信息。所以employeeId字段是我将工作日与相应员工相关联的方式。它应该使用显示所有信息的每个传递的id值。希望它现在清楚。

1 个答案:

答案 0 :(得分:1)

您无法直接绑定ArrayListth:object。相反,您应该创建一个将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>