簡體   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