保存到数据库时单次省略字段

时间:2017-04-06 13:02:56

标签: java spring hibernate spring-mvc jpa

场景:我有User个实体,我创建用户,其中密码由BCryptPasswordEncoder编码。然后我有编辑我User的表单。我是这样做的:

@Controller
@RequestMapping("/users")
@SessionAttributes("userForm")
public class UserController {

    @RequestMapping(value = "/{userId}/edit", method = RequestMethod.GET)
    public String showEditUserForm(@PathVariable("userId") long userId, 
        Model model) {
    model.addAttribute("userForm", userService.findUserById(userId));
    return "userEdit";
    }

    @RequestMapping(value = "/{userId}/edit", method = RequestMethod.POST)
    public String editUser(@Valid @ModelAttribute("userForm") User 
        userForm, BindingResult bindingResult,
        @PathVariable("userId") long userId, Model model, SessionStatus status) {

    if (bindingResult.hasErrors()) {
        return "userEdit";
    } else {
        userService.save(userForm);
        status.setComplete();
        return "redirect:/users/" + userId;
    }
}

问题:当我提交编辑表单时,我的密码更改,我无法登录到我的帐户。有没有办法保存User,例如用户名和密码字段?或者有没有更好的方法来实现这个目标?

1 个答案:

答案 0 :(得分:1)

基本上,您的数据库存在设计问题,即您的数据库设计将安全性详细信息与其他详细信息混淆。

要通过保留现有设计来解决问题,您可以使用以下方法,但我强烈建议将数据分开。

if (bindingResult.hasErrors()) {
   return "userEdit";
} else {
    User userDB = userService.findUserById(userId);
    //compare the new & db values 
    //i.e., userForm and userDB and then update to userDB
    //userDB.setX(userForm.getX());
    //IGNORE PWD FIELDS, DO NOT UPDATE THEM TO userDB object
    userService.save(userDB);
    status.setComplete();
    return "redirect:/users/" + userId;
}

此外,我建议不从数据库中获取安全性详细信息(如密码等),除非视图绝对需要它们。

  

在GET方法中初始化userForm时,它仍会填充。它   从数据库获取密码,我正在寻找解决方案,仍然使用   用户作为表单,但避免干扰密码。

另一个最简单的选项是您可以通过编写HQL查询(在Hibernate中)来更新特定字段,即排除密码