Запись данных в List в Thymeleaf

123
02 января 2021, 22:40

Как записывать данные в 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>
Answer 1

Проблема решается очень легко.

Шаг 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".

Это все.

READ ALSO
FTP портит файлы JS

FTP портит файлы JS

При загрузке и скачивании файлов JS через FileZilla часто вижу, что файлы портятсяКак решить эту проблему?

99
Ассинхронные функции js

Ассинхронные функции js

Почему "j" выводится,после того как функция qwe отработает? По идее же первая функция берёт обещание от qwe() что та вернёт колбек и род функция...

113
Есть калькулятор, не могу поправить его на счет месяцев, сейчас он считает дни

Есть калькулятор, не могу поправить его на счет месяцев, сейчас он считает дни

Всем привет, на сайте стоит калькулятор, он считает дни (я кручу бегунок и к текущей дате скрипт прибавляет дни в зависимости от того сколько...

106