spring mvc 3 - SessionAttributes似乎不起作用

时间:2011-08-23 08:03:57

标签: java spring spring-mvc spring-aop spring-3

我已经尝试过,但无法弄清楚这里发生了什么。

  1. 我有一个使用@Controller注释的简单控制器
  2. 我也有@SessionAttributes
  3. 的注释
  4. 我处理GET请求并将对象放入模型中。
  5. 当我从表单中取回POST时,我只返回用户填充的内容。我没有收回完整的物品。
  6. 我是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(); 
    }
    

    你看到我可能错过的任何东西吗?我花了将近一天的时间试图解决这个问题,但事实并非如此。任何帮助将非常感激。

    更新:我弄清楚问题是什么。答案发布在下面。

3 个答案:

答案 0 :(得分:3)

我弄清楚经过多大的努力后会发生什么。我希望这能节省别人的时间。

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

  1. 会话中保存的对象使用了一些aspectj符号进行了装饰。因此,对象的属性值仅由相应的get访问器返回。
  2. 我已经进行了hibernate验证(请注意处理POST的方法中的@Valid注释)。验证器注释直接在每个字段上(如下所示):

    @NotNull 私有字符串名称;

  3. 以下是我修复它的方法。

    1. 仅出于测试目的,我删除了@Valid并注意到即使字段本身似乎为NULL,我们也在后端存储中保存了正确的数据。这就是让我了解这个问题的根本原因。
    2. 我认为验证器注释是causinI移动验证器符号来获取方法。所以代码改变如下:

      私人字符串名称;

      @NotNull public String getName(){...}

    3. 我将@Valid注释重新放入,并验证验证不再失败。

    4. 希望它帮助那里的人并为他们节省一天的工作时间。 :)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我和Azeem有同样的问题,因为他没有明确确认sessionattribute可以用来“合并”原始表单支持对象和提交中发布的更改,我想指出是的,更改从表单提交中获取合并到原始表单后备对象。

这种方法可能存在一些问题,如

所述

Spring MVC 3.0: How do I bind to a persistent object

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

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