【问题标题】:Handle update forms in Spring MVC在 Spring MVC 中处理更新表单
【发布时间】:2015-11-23 02:24:48
【问题描述】:

在 Spring MVC 中处理编辑对象的正确方法是什么。假设我有用户对象:

public class User {
    private Integer id;
    private String firstName;
    private String lastName;
    //Lets assume here are next 10 fields...


    //getters and setters
}

现在在我的控制器中,我有 GET 和 POST 的 url:user/edit/{id}

@RequestMapping(value = "/user/edit/{user_id}", method = RequestMethod.GET)
public String editUser(@PathVariable Long user_id, Model model) {
    model.addAttribute("userForm", userService.getUserByID(user_id));
    return "/panels/user/editUser";
}


@RequestMapping(value = "/user/edit/{user_id}", method = RequestMethod.POST)
public String editUser(@Valid @ModelAttribute("userForm") User userForm,
            BindingResult result, @PathVariable String user_id, Model model) {
    if(result.hasErrors()) {
        User user = userService.getById(user_id);
        user.updateFields(userForm);
    }
    userService.update(user);
}

现在的问题是我真的需要在 POST 方法中从数据库中获取我的用户并在某些更新方法中一一更新每个字段还是有更好的方法?

我正在考虑为用户使用@PathVariable 并使用转换器从数据库中获取用户,然后以某种方式将来自 POST 方法的参数自动注入该对象。像这样的:

@RequestMapping(value = "/user/edit/{user}", method = RequestMethod.POST)
public String editUser(@Valid @PathVariable("user") User userForm,
    BindingResult result, Model model)

但是当我尝试这个时,我遇到了 BindingResults 错误:

java.lang.IllegalStateException: Errors/BindingResult 参数应该在模型属性、@RequestBody 或@RequestPart 参数之后立即声明

有什么简单的方法可以创建控制器来处理对象编辑,还是我需要复制可以一一更改的字段??

顺便说一句,我不能使用 SessionAttributes,因为它会导致多个选项卡出现问题。

【问题讨论】:

  • 如果你找到了一个很好的解决方案,请分享它,因为我一直在寻找完全相同的问题。

标签: java spring spring-mvc spring-data


【解决方案1】:

我相信您将“userForm”作为模型属性发送。如果是这样,请尝试以下模式,

@RequestMapping(value = "/user/edit/{user_id}", method = RequestMethod.POST)
public String editUser(@PathVariable String user_id, @Valid @ModelAttribute("userForm") User userForm,
BindingResult result, Model model)

谢谢

【讨论】:

  • 我错过了 pathVariable 的部分,但这不是重点。再次阅读我的问题,我的问题是我想要更新对象而不需要一个一个地复制每个字段..
【解决方案2】:

您将用户 ID 保留在隐藏在编辑表单中的输入中。

@RequestMapping(value = "/user/edit", method = RequestMethod.POST)
public String editUser(@Valid @ModelAttribute("userForm") User userForm,
    BindingResult result,Model model){

 if(result.hasErrors()){

    User user = userService.getById(userForm.getId());
    user.updateFields(userForm);
 }
 userService.update(user);
 return "redirect:.......";
}

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2013-10-15
    相关资源
    最近更新 更多