Spring MVC + Thymeleaf:为什么视图向控制器返回一个新对象,而不是原来的视图?

时间:2019-07-12 23:18:33

标签: spring mongodb thymeleaf

更新对象时,会将其作为模型属性发送到视图。但是,当视图返回时,它不带_id(一个新对象)。 MongoDB继续创建一个新对象,而不是更新现有对象。为了避免这种情况,我在视图中将对象的ID作为隐藏输入包括在内,但这感觉不对。还有另一种方法可以实现这一目标,一种更“专业”的方法吗?

@Controller
@RequestMapping("users")
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping(value = "/save")
    public String saveUserForm(@RequestParam("id") String id, Model model)
    {           
        User user = userRepository.findById(id).get();
        model.addAttribute("user", user);
        return "saveUser";
    }
    @PostMapping(value = "/save") 
    public String saveUser(@ModelAttribute("user") User user) 
    {
        userRepository.save(user);
        return "redirect:/users";
    }
}

**********************saveUser.html***************************
...
<form th:method="POST" th:modelAttribute="user" th:action="@{/users/save}" th:id="saveUserForm">
    <input type="hidden" name ="userId" th:value="${user.userId}"/>
    <label for="name">Name: </label>
    <input type="text" name="name"  th:value="${user.name}"/>
    <br /> 
    <label for="creationDate">Creation: </label>
    <input type="date" name="creationDate"  th:field="${user.creationDate}"/>
    <br /> 
    <input type="submit" value="Update" />
</form>
...

1 个答案:

答案 0 :(得分:0)

您可以在控制器上使用@SessionAttributes("user")。在此控制器期间,它将user对象临时存储在会话中,因此您不必包括隐藏的属性。