Как записывать данные в 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"
.
Это все.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
При загрузке и скачивании файлов JS через FileZilla часто вижу, что файлы портятсяКак решить эту проблему?
Почему "j" выводится,после того как функция qwe отработает? По идее же первая функция берёт обещание от qwe() что та вернёт колбек и род функция...
Всем привет, на сайте стоит калькулятор, он считает дни (я кручу бегунок и к текущей дате скрипт прибавляет дни в зависимости от того сколько...