Как улучшить запросы в контроллере и форме для вложенных объектов?

186
11 октября 2018, 15:10

Я новичок в Spring MVC и thymeleaf. Написал работающий код, но есть подозрение, что я использую костыли в контроллере и форме (результат поверхностного знакомства с thymeleaf).

Есть класс Person для хранения данных о пользователе, у него есть поля типа Set<Address> и Set<PhoneNumber>. Для их заполнения я использую геттеры в контроллере (метод add()) - и кажется, это не очень правильный способ. Есть ли какой другой способ заполнения этих полей данными?

Класс Person (геттеры и сеттеры и импорты я везде опустил):

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    private String lastName;
    @NotNull
    private String firstName;
    private String patronymic;
    @ElementCollection(fetch = FetchType.LAZY)
    @CollectionTable(name = "person_phone_numbers", joinColumns = @JoinColumn(name = "person_id"))
    private Set<PhoneNumber> phoneNumbers = new HashSet<>();
    @ElementCollection(fetch = FetchType.LAZY)
    @CollectionTable(name = "person_addresses", joinColumns = @JoinColumn(name = "person_id"))
    @AttributeOverrides({
            @AttributeOverride(name = "addressLine1", column = @Column(name = "house_number")),
            @AttributeOverride(name = "addressLine2", column = @Column(name = "street"))
    })
    private Set<Address> addresses = new HashSet<>();
    public Person() {
    }
    public Person(String lastName, String firstName, String patronymic,
                  Set<PhoneNumber> phoneNumbers, Set<Address> addresses) {
        this.lastName = lastName;
        this.firstName = firstName;
        this.patronymic = patronymic;
        this.phoneNumbers = phoneNumbers;
        this.addresses = addresses;
    }

Класс PhoneNumber:

@Embeddable
public class PhoneNumber {
    @Size(max = 30)
    private String type;
    @NotNull
    @Size(max = 10)
    private String number;
    public PhoneNumber() {
    }
    public PhoneNumber(@Size(max = 30) String type, @NotNull @Size(max = 10) String number) {
        this.type = type;
        this.number = number;
    }

Класс Address:

import javax.persistence.Embeddable;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Embeddable
public class Address {
    @NotNull
    @Size(max = 100)
    private String addressLine1;
    @NotNull
    @Size(max = 100)
    private String addressLine2;
    @NotNull
    @Size(max = 100)
    private String city;
    @NotNull
    @Size
    private String region;
    @NotNull
    @Size
    private String country;
    @NotNull
    @Size
    private String zipCode;
    public Address() {
    }
    public Address(@NotNull @Size(max = 100) String addressLine1, @NotNull @Size(max = 100) String addressLine2,
                   @NotNull @Size(max = 100) String city, @NotNull @Size String region,
                   @NotNull @Size String country, @NotNull @Size String zipCode) {
        this.addressLine1 = addressLine1;
        this.addressLine2 = addressLine2;
        this.city = city;
        this.region = region;
        this.country = country;
        this.zipCode = zipCode;
    }

Контроллер:

@Controller
public class MainController {
    @Autowired
    private PersonRepository personRepository;
 @GetMapping("/main")
    public String main(Map<String, Object> model) {
        Iterable<Person> persons = personRepository.findAll();
        model.put("persons", persons);
        return "main";
    }
    @PostMapping("/main")
    public String add(@ModelAttribute Person person, @ModelAttribute PhoneNumber phoneNumber,
                      @ModelAttribute Address address, Model model) {
        person.getPhoneNumbers().add(phoneNumber);
        person.getAddresses().add(address);
        personRepository.save(person);
        Iterable<Person> persons = personRepository.findAll();
        model.addAttribute("persons", persons);
        return "main";
    }

Код вьюхи:

<html xmlns:th="http://www.w3.org/1999/xhtml">
<body>
<div>
    <h2>Введите данные контакта</h2>
    <form method="post">
        <input type="text" name="lastName" placeholder="Фамилия"/>
        <input type="text" name="firstName" placeholder="Имя">
        <input type="text" name="patronymic" placeholder="Отчество">
        <p>
            <input type="text" name="type" placeholder="Тип"/>
            <input type="text" name="number" placeholder="Номер">
        </p>
        <p>
            <input type="text" name="addressLine1" placeholder="Номер дома"/>
            <input type="text" name="addressLine2" placeholder="Улица"/>
            <input type="text" name="city" placeholder="Город"/>
            <input type="text" name="region" placeholder="Регион"/>
            <input type="text" name="country" placeholder="Страна"/>
            <input type="text" name="zipCode" placeholder="Код"/>
        </p>
        <button type="submit">Добавить</button>
    </form>
</div>
<div><h2>Список контактов </h2></div>
<div>
    <p th:each="person : ${persons}"
       th:text="${person.id} + '. ' + ${person.lastName} + ' ' + ${person.firstName} +
        ' ' + ${person.patronymic} + '. Тел.: ' + ${person.phoneNumbers} + ${person.addresses}"> PERSON
        TEST </p>
</div>
</body>
</html>
READ ALSO
Проблема с кодировками

Проблема с кодировками

Имеется утилита, которая запускает батники, которые в свою очередь собирают инфу с помощью утилиты wmic и потом с них форматирует отчет на рабочий...

179
Не получается получить данные с DialogFragment

Не получается получить данные с DialogFragment

Есть адаптер который генерирует и обрабатываете клики по елементам, из него вызывается при нажатии на картинку fragmentDialog в котором есть edittextМы...

182
Переход из фрагмента в активити по кнопке

Переход из фрагмента в активити по кнопке

Не получается реализовать переход из фрагмента в активити по кнопкеПерерыв весь интернет, решила попросить о помощи, т

169
Как реализовать общение двух и больше компьютеров в java?

Как реализовать общение двух и больше компьютеров в java?

как реализовать общение между двумя и больше компьютеров? Читал что нужно использовать сокеты, но возможно есть и другой вариант? Раньше...

135