2011-08-23 69 views
1

我已經嘗試過並嘗試過,但無法弄清楚這裏發生了什麼。春天mvc 3 - SessionAttributes似乎並沒有工作

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

你看到任何東西,我可能錯過了什麼?我花了將近一天的時間,試圖弄清楚這一點,但不能。任何幫助將非常感激。

更新:我找出了問題所在。下面發佈答案。

回答

3

我想通了很多勞動後發生了什麼。我希望這可以節省時間。

這裏的根本問題是雙重的:

  1. 對象被保存在會議上裝飾着一些AspectJ的符號。正因爲如此,對象的屬性值才由適當的get訪問器返回。
  2. 我已經進行了hibernate驗證(注意處理POST的方法中的@Valid註釋)。驗證器註釋直接在每個字段上(如下所示):

    @NotNull private String name;

這是我如何修復它。

  1. 僅出於測試目的,我刪除了@Valid,並注意到即使字段本身似乎爲NULL,我們仍將正確的數據保存在我們的後端存儲中。這就是導致我陷入這個問題的根源的原因。
  2. 我想到驗證者註釋是causinI移動驗證符表示法來獲取方法。所以代碼更改如下:

    私人字符串名稱;

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

  3. 我把@Valid註釋放回去,並驗證驗證不再失敗。

希望它可以幫助那裏的人,併爲他們節省一天的工作時間。 :)

1

我不希望Spring將屬性表單會話和表單合併。您應該將表單提交的用戶和會話中的用戶分開。

0

我和Azeem有同樣的問題,既然他沒有明確確認sessionattribute可以用來將原始表單支持對象與提交中發佈的更改「合併」,我想指出是的,表單提交的更改會合併到原始表單支持對象中。

可能有一些問題,這種方法在

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

指出,但這種做法是非常有用的,當你有一個複雜的表單支持對象,但你只允許用戶更新少數的表單中的對象圖成員,並且不使用隱藏字段來維護表單元素中複雜對象的其餘部分。

如果在類中使用此方法時未使用@SessionAttributes(「xxx」)註釋,則返回的表單支持對象基本上爲空,除了表單專門提交的那些成員。這可以使持久更新的對象非常困難,因爲您必須自己將新更新合併到原始對象中。但通過使用會話屬性,提交後提供的完整更新後的表單支持對象使對象圖持久化變得更容易。