Прежде всего, вы не уверены, что список ингредиентов не равен нулю.Подумайте о случае, когда вы вызываете свой контроллер, и рецепт не равен нулю, но атрибут рецепта содержит список ингредиентов.Он будет отправлен как ноль на ваш взгляд.Вы можете изменить его, например, на:
if(recipe==null){
recipe = new ViewRecipe();
recipe.setIngredientList(new ArrayList<>());
}else if(recipe.getIngredientList() == null){
recipe.setIngredientList(new ArrayList<>());
}
model.addAttribute(AttributeNames.VIEW_RECIPE, recipe);
Во-вторых, вы используете выражения выбора (*{...}
) в своих полях th: это хорошо, но вам нужно, чтобы в вашей команде был определен объект команды.формировать тоже и ссылаться на него из входов.Вы можете сделать это, добавив объект команды в форму следующим образом:
<form id="get-recalculated-recipe" th:object="${view-recipe}" action="#" method="post">
и изменив поля th: для ссылки на него с помощью итератора, чтобы входная информация передавалась при публикации формы.Также добавив th: значение, чтобы фактически получить текущее значение атрибутов при загрузке страницы:
<tr th:each="ing, iter : ${view-recipe.ingredientList}">
<td>
<input type="text" th:value="${ing.quantity}" th:field="*{ingredientList[__${iter.index}__].quantity}"/>
</td>
<td>
<input type="text" th:value="${ing.unit}" th:field="*{ingredientList[__${iter.index}__].unit}"/>
</td>
<td>
<input type="text" th:value="${ing.ingredientName}" th:field="*{ingredientList[__${iter.index}__].ingredientName}"/>
</td>
</tr>
Я предлагаю вам взглянуть на https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html, это поможет вам в будущем.