Проблема с Spring MVC.Как я могу создать вид из двух или более объектов? - PullRequest
1 голос
/ 13 февраля 2011

[весна 3.0.5] [jboss 5.1]

А есть два класса

public class User {
 private String name;
 private String surname;
 private Address address;
...
sets and gets 
setters and getters  
}

public class Address {
 private String street;

...
setters and getters  
}

В контроллере у меня есть этот код:

@Controller 
public class MyController {

@RequestMapping(value = "/index")
public ModelAndView showForm() {
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
User user = new User();
Address adr = new Address();
mav.addObject("user", user);
mav.addObject("adr", adr);
}

А теперь я хочу создать из двух элементов ввода в JSP

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

    <html><head><body>
    <form:form method="POST" commandName="user">
    <form:label path="name" />
    <form:input path="name" />
    <form:label path="adr.street" />
    <form:input path="adr.street" />
    </form:form>
    </body>
    </html>

Когда я запускаю, получаю исключение, подобное этому:

org.springframework.beans.NotReadablePropertyException: недопустимое свойство 'adr' класса бина [form.User]: свойство бина 'adr' недоступно для чтения или имеет недопустимый метод получения: соответствует ли возвращаемый тип получателя параметру тип сеттера? org.springframework.beans.BeanWrapperImpl.getPropertyValue (BeanWrapperImpl.java:707) org.springframework.be

Может кто-нибудь объяснить мне, почему и как улучшить код?

Ответы [ 3 ]

3 голосов
/ 13 февраля 2011

Оберните ваши объекты в класс-оболочку и передайте его в модель.

public class MyForm
{
   public user;
   public address;
   // getters, setters, etc.
}

Тогда

ModelAndView mav = new ModelAndView(); // ModelAndView
mav.addObject("myForm", new MyForm()); // e.g.

В вашей модели адрес должен быть привязан к пользователю?Другими словами, мне кажется, что User имеет отношение один ко многим с Address, и вы должны позволить своему уровню доступа к данным справиться с этими проблемами.

@Entity
@Table(name = "user")
public class User
{
   @Id @Column(name="user_id")
   public Long id;

   @OneToMany
   @JoinColumn(name = "user_id") // so the address table would have a user_id foreign key
   public Address address;
}
2 голосов
/ 14 февраля 2011

Вы также можете сделать следующее, что помешает вам ввести новый класс строго для целей отображения. Пружинные формы могут обрабатывать вложенные свойства.

User user = new User();
Address adr = new Address();
user.setAddress(adr);
mav.addObject("user", user);

В вашем .jsp вы бы достигли адресного объекта следующим образом:

<form:form method="POST" commandName="user">
<form:label path="name" />
<form:input path="name" />
<form:label path="address.street" />
<form:input path="address.street" />
</form:form>
0 голосов
/ 13 февраля 2011

Свойство объекта user является address (я полагаю, у вас есть метод get с именем getAddress ()), поэтому в форме вы должны использовать адрес вместо adr:

<form:label path="address.street" />
<form:input path="address.street" />

или создать метод полученияназывается getAdr () (как вы хотите)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...