繁体   English   中英

Spring MVC 3-SessionAttributes似乎不起作用

[英]spring mvc 3 - SessionAttributes doesn't seem to be working

我试了又试,但不知道这是怎么回事。

  1. 我有一个使用@Controller注释的简单控制器
  2. 我也有@SessionAttributes的注释
  3. 我处理GET请求,然后将对象放入模型。
  4. 从表单取回POST时,我仅取回用户已填充的内容。 我没有找回完整的对象。

我是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(); 
}

您看到我可能错过的任何东西吗? 我花了将近一天的时间试图弄清楚这一点,但事实并非如此。 任何帮助将非常感激。

更新:我知道了问题所在。 答案发布在下面。

我弄清楚了很多劳累之后的情况。 我希望这可以节省其他人的时间。

这里的根本问题是双重的:

  1. 会话中保存的对象已用一些aspectj标记修饰。 因此,对象的属性值仅由适当的get访问器返回。
  2. 我已经设置了休眠验证(请注意处理POST的方法中的@Valid注释)。 验证者注释直接位于每个字段上(如下所示):

    @NotNull私有字符串名称;

这是我固定的方法。

  1. 仅出于测试目的,我删除了@Valid并注意到,即使字段本身看起来为NULL,我们仍将正确的数据保存在后端存储中。 这就是使我陷入此问题的根本原因的原因。
  2. 我认为验证器注释是因果关系,因此我将验证器注释移到了方法中。 因此,代码更改如下:

    私有字符串名称;

    @NotNull公共字符串getName(){...}

  3. 我放回@Valid批注,并验证验证不再失败。

希望它可以帮助某人并为他们节省一天的工作。 :)

我和Azeem有相同的问题,因为他没有明确确认sessionattribute可用于“合并”原始表单支持对象和提交中的更改,所以我想指出的是,是对表单的更改提交合并到原始表单支持对象中。

如该方法中指出的那样,可能存在一些问题

Spring MVC 3.0:如何绑定到持久对象

但是,当您具有复杂的表单支持对象时,这种方法非常有用,但是您只允许用户更新表单中的一些对象图成员,而不使用隐藏字段来维护表单元素中其余的复杂对象。

当在类上不使用@SessionAttributes(“ xxx”)注释的情况下使用此方法时,返回的表单支持对象基本上为null,但由表单专门提交的成员除外。 这会使持久保存更新的对象非常困难,因为您必须自己将新的更新组合到原始对象中。 但是,通过使用sessionattribute,提交后提供的完整更新的表单支持对象使持久化对象图变得更加容易。

我不希望spring将属性表单会话和表单合并。 您应该将表单提交的用户以及该用户与会话分开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM