gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:29:10 26 4
gpt4 key购买 nike

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

@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 ,例如排除用户名和密码字段?或者也许有更好的方法来实现这一目标?

最佳答案

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

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

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;
}

此外,我建议不要从数据库中获取安全详细信息(如密码等),除非 View 绝对需要这些信息

It populates anyway while initializing userForm in GET method. It takes password from database, I'm looking for solution, to still use User as form but avoid interfering with the passw.

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

关于java - 保存到数据库时单次省略字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43256035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com