Spring MVC Master детали задач - PullRequest
       4

Spring MVC Master детали задач

0 голосов
/ 01 марта 2012

У меня есть модель данных, которая состоит из отношения мастер-деталь, где один клиент может быть связан со многими объектами адреса. Я сгенерировал доменные объекты с помощью Hibernate Tools и получил следующие (упрощенные) классы.

Client.java

    @Entity
@Table(name="Client")
public class Client  implements java.io.Serializable {
     private Set<Address> addresses = new HashSet<Address>(0);

@OneToMany(fetch=FetchType.LAZY, mappedBy="client")
    public Set<Address> getAddresses() {
        return this.addresses;
    }

    public void setAddresses(Set<Address> addresses) {
        this.addresses = addresses;
    }

}

Address.java

@Entity
@Table(name="Address")
public class Address  implements java.io.Serializable {

     private AddressId id;
     private AddressType addressType;
     private Client client;
     private String addressLine1;



    @AttributeOverrides( {
        @AttributeOverride(name="clientId", column=@Column(name="ClientId", nullable=false) ), 
        @AttributeOverride(name="addressTypeId", column=@Column(name="AddressTypeId", nullable=false) ) } )
    public AddressId getId() {
        return this.id;
    }

    public void setId(AddressId id) {
        this.id = id;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="ClientId", nullable=false, insertable=false, updatable=false)
    public Client getClient() {
        return this.client;
    }

    public void setClient(Client client) {
        this.client = client;
    }    
}

Я хочу написать форму, которая позволит пользователю добавлять запись клиента и запись адреса одновременно, поэтому в моем контроллере я создаю экземпляр Client и помещаю его в ModelMap. Я могу с удовольствием обратиться к полям объекта Client в моем jsp, но не знаю, как ссылаться на поля в объекте Address.

Код, подобный <form:input type="text" path="addresses[0].addressLine1" />, приводит к следующему исключению

org.springframework.beans.InvalidPropertyException: недопустимое свойство 'addresss [0]' класса бина [com.greenock.saltcam.hibernate.domain.Client]: недопустимая попытка получить свойство 'addresss; возникла исключительная ситуация; вложенное исключение: org.springframework.beans.InvalidPropertyException: недопустимое свойство 'address [0]' класса компонента [com.greenock.saltcam.hibernate.domain.Client]: невозможно получить элемент с индексом 0 из набора размера 0, доступ к которому осуществляется с помощью свойство path 'address [0]'

Это не кажется мне необоснованным (набор равен пусто), но означает ли это, что мне нужно создать пустой объект Address в моем контроллере и вставить его в к объекту клиента, прежде чем передать его в JSP? Что если я хочу разрешить пользователю добавлять произвольное количество адресов?

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Здесь - это решение, которое я реализовал.

0 голосов
/ 01 марта 2012

Я бы предложил создать отдельный объект поддержки формы:

import org.springframework.util.AutoPopulatingList;
public class ClientBackingBean {
  private Client client = new Client();
  private List<Address> addresses = new AutoPopulatingList<Address>(Address.class);
  ...
  <getters and setters>
}

Затем поместите один из них в ваш ModelMap.Вам просто нужно будет перенести данные из базового компонента в фактические объекты модели в методе контроллера, который обрабатывает публикацию формы.Приятной особенностью AutoPopulatingList Spring является то, что он будет создавать записи по мере необходимости, так что вы можете иметь javascript / jQuery в JSP, который создает адреса на лету.

...