我有我的用户对象,我试图用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获取对象?请给出解决方法,我可以保存我的查询以获取该对象
答案 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
}
您无法仅在客户端上的必需属性上工作,并将其与同一现有对象合并。