При запуске проекта весенней загрузки возникла ошибка на домашней странице Invalid property 'district' of bean class. Я знаю, почему возникает эта ошибка, потому что district является свойством дочернего объекта, и я могу передать родительский объект из метода Home() в контроллере. Я мог бы передать объект Person в модели методом Home(). но свойство district и city принадлежит объекту Address, над которым я работаю с сопоставлением отношений OneToOne.

Мой вопрос ниже:

  • Можем ли мы собрать две сущности вместе в th:object в тимелеафе
  • Можем ли мы отправить объект Address и Person вместе, используя Model из контроллера для просмотра

Stacktrace:

Вызвано: org.springframework.beans.NotReadablePropertyException: недопустимое свойство «район» класса компонента [com.rest.RestApiPojo.Entity.Person]: свойство компонента «район» не читается или имеет недопустимый метод получения: тип возвращаемого значения геттера соответствует типу параметра установщика?

Вот мой код:

< Сильный > Entity

@Entity
@Table(name = "person_master")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long p_id;

    private String name;

    private String surname;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Address address;

    // getter setter
}

@Entity
@Table(name = "address_master")
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long a_id;

    private String district;
    private String city;

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "address")
    @JoinColumn(name = "p_id")
    private Person person;

    // getter setter
}

< Сильный > услуги

@Override
public Person addPersonAddress(Person person) {
    return personRepo.save(person);
}

контроллер

@RequestMapping(value = "/", method = RequestMethod.GET)
public String Home(Model mdl)
{
    mdl.addAttribute("persons", new Person());
    return "register";
}
    
@RequestMapping(value = "/personaddress", method = RequestMethod.POST)
public String addPersonAddress(Model mdl, @ModelAttribute("person") Person person, HttpServletRequest req)
{
    Address address = person.getAddress();  // get reference of person from parent table and store in child table
        
    address.setDistrict(req.getParameter("district"));
    address.setCity(req.getParameter("city"));
        
    address.setPerson(person);
    pojoService.addPersonAddress(person);
    return "listofperson";
}

Тимелист

<form th:action="@{/personaddress}" th:object="${persons}" method="post">
        <div class="container">
        <h1 style="text-align: center">Add Person</h1>
          <div class="row">
            <div class="col-sm-12">
                <div class="mb-3">
                  <label for="exampleFormControlInput1" class="form-label">Person name</label>
                  <input type="text" class="form-control" name="name" th:field="*{name}">
                </div>
                <div class="mb-3">
                  <label for="exampleFormControlInput1" class="form-label">Person surname</label>
                  <input type="text" class="form-control" name="surname" th:field="*{surname}">
                </div>
                <div class="mb-3">
                  <label for="exampleFormControlInput1" class="form-label">District</label>
                  <input type="text" class="form-control" name="district" th:field="*{district}">
                </div>
                <div class="mb-3">
                  <label for="exampleFormControlInput1" class="form-label">City</label>
                  <input type="text" class="form-control" name="city" th:field="*{city}">
                </div>
                
                <input class="btn btn-primary" type="submit" value="Submit">
            </div>
          </div>
        </div>
    </form>
1
user4544523 26 Янв 2022 в 13:51

2 ответа

Лучший ответ

Два объекта не требуются, так как они уже были сопоставлены в классе person, просто напишите «address.district» и «address.city» в тимелеафе, вы получите это

0
Naresh Sharma 26 Янв 2022 в 15:52
Спасибо проблема решена. пожалуйста, проголосуйте за мой вопрос, потому что мне нужна как минимум 15 репутация, чтобы проголосовать за любой ответ или вопрос. если моя репутация будет >15 я могу проголосовать за ваш ответ
 – 
user4544523
26 Янв 2022 в 16:17

Это касается стандартного кода. вы можете добавить @Data в класс из библиотеки Lombok.

Если вы не используете ломбок, добавьте сеттер и геттер

public String getDistrict() {
   return district;
}

public void setDistrict(String district) {
   this.district= district;
}
0
Shamitha Silva 26 Янв 2022 в 15:08
Я не использую библиотеку Lombok.
 – 
user4544523
26 Янв 2022 в 15:05
Обновил ответ, вы можете проверить и принять
 – 
Shamitha Silva
26 Янв 2022 в 15:09
Я уже добавляю и вы не можете правильно понять мою проблему. проблема -> я мог бы передать объект Person в модели методом Home(). но свойство district и city принадлежит объекту Address
 – 
user4544523
26 Янв 2022 в 15:14
Да, добавьте это для свойства адреса
 – 
Shamitha Silva
26 Янв 2022 в 15:39