Как записывать данные в List в Thymeleaf? Выдает ошибку:
org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "registration" - line 39, col 28)
Идея проста:
Есть клиент и к нему нужно привентить 2 телефона. Пытаюсь добавить возможность считывать данные с html (post mapping у меня есть). Ошибка кроется где-то в Controller'e и в th:value="*{phoneNumber[0].phoneNumber}"
У меня есть сущность Customer:
@Data
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "customer_id")
private long id;
...
@OneToMany(mappedBy = "customer",cascade = CascadeType.ALL)
private List<PhoneNumber> phoneNumbers = new ArrayList<>();
}
Есть сущность PhoneNumbers:
@Data
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "phoneNumber")
public class PhoneNumber {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "phone_id")
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id")
private Customer customer;
@Column(name = "phone_number")
@NotEmpty(message = "*Please provide your phone number")
private String phoneNumber;
}
Мой контроллер (Уверен, первая ошибка кроется тут):
@GetMapping
public ModelAndView registration(){
ModelAndView modelAndView = new ModelAndView();
Customer customer = new Customer();
customer.getPhoneNumbers().add(new PhoneNumber());
customer.getPhoneNumbers().add(new PhoneNumber());
modelAndView.addObject("customer", customer);
modelAndView.setViewName("registration");
return modelAndView;
}
registration.html:
<form th:action="@{/registration}" method="POST">
<label>Имя
<input type="text" th:field="*{customer.name}" name="name" th:placeholder="name">
</label>
<br>
...
<h2>Телефон</h2>
<label>Контактный телефон 1
<input type="text" th:value="*{phoneNumber[0].phoneNumber}" name="phoneNumber" th:placeholder="phoneNumber">
</label>
<br>
<label>Контактный телефон 2
<input type="text" th:value="*{phoneNumber[1].phoneNumber}" name="phoneNumber" th:placeholder="phoneNumber">
</label>
<br>
<input type="submit" value="Завершить регистрацию">
</form>
Проблема решается очень легко.
Шаг 1:
customer.getPhoneNumbers().add(new PhoneNumber());
customer.getPhoneNumbers().add(new PhoneNumber());
Эти строки нам нужны для добавления пустых объектов в List. Тут, логично, добавлено 2 пустых элемента. Если потребуется добавить больше 2-4 - лучше использовать for-loop.
Шаг 1.5:
У меня была ошибка, что я отдельно вызывал PhoneNumber от Customer, поэтому надо вызывать правильно вот так: customer.phoneNumber...
Шаг 2
<input type="text" th:field="*{customer.phoneNumbers[0].phoneNumber}" name="phoneNumber" th:placeholder="phoneNumber">
При работе с list, мы отображаем наши входные данные как свойства элементов списка, используя th:field. Поэтому правильная запись будет: th:field="*{customer.phoneNumbers[0].phoneNumber}".
Стоит отметить, что при выборке объектов мы не используем .get(i), а делаем как с array: phoneNumbers[0].
Так же стоит отметить, что name должен иметь такое же название как и финальная переменная, вызванная в строке th:field - name="phoneNumber".
Это все.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей