2012-02-29 66 views
6

我想为bean X创建一个更新表单。这个bean让它说有字段A,B,C,D。 在我的表单I中只想更新字段A,B并让C和D不变。 有没有办法将bean X绑定到只有字段A和B的更新表单,以便当我提交表单C和D时不会更改?Spring MVC-如何在部分绑定到表单时不丢失字段值

我知道我可以为C和D添加隐藏字段,但如果它们不是原始字段,它们是其他bean或集合。

我知道另一个解决方案是创建一个只有字段A和B的XUpdateBean,并且在表单提交之后将字段从XUpdateBean复制到我的X bean。

在Spring 3 MVC中有更好的更新方式吗?

+0

使用闪光灯属性:http://stackoverflow.com/questions/11763779/how-to-read-flash-attributes-after-redirection-in-spring-mvc-3-1/31017551#31017551 – logixplayer 2015-06-24 05:29:24

回答

3

你可以有一个只包含你需要的字段的命令 - 对象/表单 - 树皮 - Bean。

在控制器中,您必须加载bean X,并需要使用commandObject中的字段更新其字段。

也许你可以考虑没有额外的commandObject类,而是使用class BeanX。但是,当然,您需要两个BeanX实例,一个用于commandObject,一个用于bean x。

0

对不起,我不知道SpringMVC,所以我的答案可能是错误的。

在另一个名为Stripes的绑定框架中,我们通常在绑定之前“水合”数据。 这意味着你首先从数据库中加载bean,然后才能将A和B的值绑定到它!但是由于bean来自DB(通常是JPA实体),它仍然具有C和D原始值。因此你不需要隐藏的C和D域!

看来可能用SpringMVC有: Spring MVC 3.0: How do I bind to a persistent object

请注意,您还可以加载绑定到“非DB豆”像你真正做,(所以你有C和d字段为空,我想,如果你不使用隐藏的字段)。然后,您可以简单地从数据库加载要修改的bean,然后在所需字段的绑定bean和db bean之间进行合并(在这里,您只合并A和B,以便C和DB bean中的D字段将不会被修改)

您可以在这里找到一些有关数据绑定的有趣内容。对我来说,在一些棘手的情况下,直接绑定到数据库对象可以是危险的: How to use a binding framework efficiently

0

正确的方法,在我的脑海里,尤其是在乐观并发控制(@版本)打交道时是暂时存放在会话中的模型属性。

@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"; 
    } 
} 
相关问题