【问题标题】:Problem with Spring MVC. How can I create view from two or more object?Spring MVC 的问题。如何从两个或多个对象创建视图?
【发布时间】:2011-02-13 18:43:44
【问题描述】:

[春季 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: Invalid property 'adr' of bean class [form.User]: Bean property 'adr' is not read or has an invalid getter method: getter的返回类型是否与参数匹配二传手的类型? org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:707) org.springframework.be

有人可以向我解释一下为什么以及如何改进代码吗?

【问题讨论】:

  • 你确定没有编译错误吗?您还没有在 showForm 方法中返回 ModelAndView 对象。
  • 我们需要看到实际的 getter 和 setter,而不仅仅是“setter 和 getter”。
  • 请不要忘记接受您喜欢的答案,例如Bozho 对您之前问题的回答。这是为了鼓励人们帮助你。

标签: java spring jsp spring-mvc


【解决方案1】:

将您的对象包装在一个包装表单类中并将其传递给模型。

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

然后

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

在您的模型中,地址是否应该附加给用户?换句话说,在我看来,UserAddress 之间存在一对多关系,您应该让数据访问层处理这些问题。

@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】:

您还可以执行以下操作,这将阻止您引入一个严格用于显示目的的新类。 Spring 表单可以处理嵌套属性。

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>

【讨论】:

  • 我建议使用&lt;c:out value="${user}"&gt;&lt;/c:out&gt; 测试变量的输出。它帮了我很大的忙!
【解决方案3】:

对象用户的属性是地址(我假设你有一个叫做getAddress()的getter),所以在表单中你必须使用地址而不是adr:

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

或创建一个名为 getAdr() 的 getter(根据需要)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多