Spring MVC:将复杂对象绑定到UI

时间:2013-06-03 11:13:39

标签: spring java-ee spring-mvc

我有我的用户对象,我试图用Spring MVC绑定到UI。用户对象中有另一个对象地址。

public class User {
    String firstName;
    String lastName;
    String userName;
    Address address;
}

地址obj。

public class Address {
    String street;
    String House;
    String country;
}

当我将用户对象绑定到UI时说对于编辑用户功能我只想保留firstName和lastName。

现在我的第一个问题是,如果我不将用户的其余属性保留为隐藏字段,那么我将获得这些值为null。这意味着UI上的绑定对象是User对象的新实例。我不能处理同一个用户对象并将其绑定到UI上,只获取具有旧值的更新值吗?

其次:通过隐藏字段方法我没有得到Address对象,我为此

得到null
<form:hidden path="user.address" />

用户是我的模态属性。

我不知道,我对Spring MVC的理解可能存在差距。对于UI上的绑定对象,我们总是要创建新实例吗?如果嵌套我们如何在绑定的模态属性中获得嵌套对象(地址)?

一旦选项,我猜是使用粘合剂。但据我所知,binder还将使用id获取对象?请给出解决方法,我可以保存我的查询以获取该对象

1 个答案:

答案 0 :(得分:14)

要重新获得Address个对象,您需要列出每个属性:例如:

<form:hidden path="user.address.street" />
<form:hidden path="user.address.country" />

等等。

现在,绑定到UI的对象是您从控制器传递的对象。我假设在提交表单时,您希望将User对象作为@ModelAttribute返回。在这种情况下,您有两个选择:第一个是您需要在客户端列出User对象的所有属性(作为隐藏对象或可见的表单元素)。

第二个选项是:您只在客户端显示所需的属性,而不是将所有其他属性列为隐藏字段,只保留id实例的User为一个隐藏的领域。现在,当您在表单提交时收到此@ModelAttribute时,您可以使用id从数据库加载整个对象,并在调用update之前在其上设置更新的属性。

代表:

@RequestMapping("updateUser.do")
public String updateUser(@ModelAttribute User user, ... /* rest of the args */) {
    // ... some other code
    User existingUser = userService.findById(user.getId());
    existingUser.setFirstName(user.getFirstName());
    existingUser.setLasstName(user.getLastName());

    userService.update(existingUser);
    // ... rest of the code
}

您无法仅在客户端上的必需属性上工作,并将其与同一现有对象合并。