Forms SpringMVC-如何在部分绑定到表单时不丢失字段值

Forms 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

我想为一个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


在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属性: