我已经尝试过,但无法弄清楚这里发生了什么。
我是SessionAttributes的新手,但我认为这保留了整个对象,当使用@ModelAttribute在方法中读回对象时,它将合并对象(即表单更改的对象)。但是,我没有看到这种行为。
非常感谢任何帮助。
以下是代码中的相关部分:
@Controller
@RequestMapping("/user")
@SessionAttributes("user")
public class UserController
{
// ...
@RequestMapping(value = "/{login}", method = RequestMethod.GET)
public String profile(Model model, @PathVariable("login") String login)
{
// ...
model.addAttribute("user", user);
// ...
}
@RequestMapping(value="/{login}", method = RequestMethod.POST)
public String saveProfile(@ModelAttribute("user") @Valid User user, BindingResult result, SessionStatus status)
{
if (result.hasErrors())
{
return "user/index";
}
// ...
status.setComplete();
return "redirect:/user/"+user.getLogin();
}
你看到我可能错过的任何东西吗?我花了将近一天的时间试图解决这个问题,但事实并非如此。任何帮助将非常感激。
更新:我弄清楚问题是什么。答案发布在下面。
答案 0 :(得分:3)
我弄清楚经过多大的努力后会发生什么。我希望这能节省别人的时间。
这里的根本问题是双重的:
我已经进行了hibernate验证(请注意处理POST的方法中的@Valid注释)。验证器注释直接在每个字段上(如下所示):
@NotNull 私有字符串名称;
以下是我修复它的方法。
我认为验证器注释是causinI移动验证器符号来获取方法。所以代码改变如下:
私人字符串名称;
@NotNull public String getName(){...}
我将@Valid注释重新放入,并验证验证不再失败。
希望它帮助那里的人并为他们节省一天的工作时间。 :)
答案 1 :(得分:1)
我不希望spring合并表单会话和表单的属性。您应该将表单提交的用户与会话中的用户分开。
答案 2 :(得分:1)
我和Azeem有同样的问题,因为他没有明确确认sessionattribute可以用来“合并”原始表单支持对象和提交中发布的更改,我想指出是的,更改从表单提交中获取合并到原始表单后备对象。
这种方法可能存在一些问题,如
所述Spring MVC 3.0: How do I bind to a persistent object
但是当你有一个复杂的表单支持对象时,这种方法非常有用,但是你只允许用户更新表单中的一些对象图成员,而不是使用隐藏字段来维护复杂对象的其余部分。形式元素。
如果在不使用类的@SessionAttributes(“xxx”)注释的情况下使用此方法,则返回的表单支持对象基本上为null,除了表单专门提交的那些成员。这可能会使更新的对象持久化非常困难,因为您必须自己将新更新合并到原始对象中。但是使用sessionattribute,提交后提供的完整更新表单支持对象使得保持对象图更容易。