Forms SpringMVC-如何在部分绑定到表单时不丢失字段值
我想为一个bean X制作一个更新表单。这个bean让我们说它有字段a、B、C、D。 在我的表单中,我只想更新字段A、B,让C和D保持不变。 有没有一种方法可以将bean X绑定到只包含字段a和B的更新表单,这样当我提交表单C和D时就不会被更改 我知道我可以为C和D添加隐藏字段,但如果这些字段不是基本字段,那么它们是其他bean或集合 我知道另一个解决方案是创建一个XUpdateBean,它只包含字段a和B,然后在表单提交后将字段从XUpdateBean复制到我的X beanForms SpringMVC-如何在部分绑定到表单时不丢失字段值,forms,spring,data-binding,spring-mvc,Forms,Spring,Data Binding,Spring Mvc,我想为一个bean X制作一个更新表单。这个bean让我们说它有字段a、B、C、D。 在我的表单中,我只想更新字段A、B,让C和D保持不变。 有没有一种方法可以将bean X绑定到只包含字段a和B的更新表单,这样当我提交表单C和D时就不会被更改 我知道我可以为C和D添加隐藏字段,但如果这些字段不是基本字段,那么它们是其他bean或集合 我知道另一个解决方案是创建一个XUpdateBean,它只包含字段a和B,然后在表单提交后将字段从XUpdateBean复制到我的X bean 在Spring3M
在Spring3MVC中有没有其他更好的更新方法?您可以拥有一个只包含所需字段的命令对象/表单BarkingBean 在控制器中,您必须加载BeanX,并且需要使用commandObject中的字段更新其字段
您也可以考虑不为commandObject提供额外的类,而是使用类BeanX。当然,您需要两个BeanX实例,一个用于commandObject,一个用于BeanX。对不起,我不知道SpringMVC,所以我的答案可能是错误的 对于另一个称为Stripes的绑定框架,我们通常在绑定之前“水合”数据。 这意味着您首先从db加载bean,然后才将A和B值绑定到它!但是它仍然有C和D的原始值,因为bean来自DB(通常是JPA实体)。因此,您不需要隐藏的C和D字段 使用SpringMVC似乎是可能的: 请注意,您也可以像实际操作一样将绑定加载到“非DB bean”(因此,如果不使用隐藏字段,我想C和D字段将为空)。然后,您可以简单地从DB加载您想要修改的bean,并在绑定bean和DB bean之间合并您想要的字段(在这里,您将只合并a和B,这样DB bean中的C和D字段就不会被修改) 您可以在这里找到一些关于数据绑定的有趣内容。对于我来说,在某些棘手的情况下,直接绑定到DB对象可能是危险的:
在我看来,正确的方法,尤其是在处理乐观并发控制(@Version)时,是在会话中临时存储model属性
@Controller
@SessionAttributes("x")
public class MyController {
@Autowired
private XRepository xRepository;
@InitBinder
void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("id", "c", "d");
}
@RequestMapping("/x/{id}")
String myForm(@PathVariable("id") long id, Model model) {
X x = xRepository.findOne(id);
model.addAttribute("x", x);
return "x-edit";
}
@RequestMapping(value="/x/{id}", method= RequestMethod.POST)
String save(@PathVariable("id") long id, @ModelAttribute X x, SessionStatus sessionStatus) {
xRepository.save(x);
sessionStatus.setComplete();
return "x-edit";
}
}
使用flash属性: