2009-09-03 60 views
13

@SessionAttributes在什麼確切的情況下被清除?嘗試在頁面中使用兩個模型時,我發現了一些令人困惑的行爲。什麼時候SpringMVC中的@SessionAttributes被刪除? (With code sample)

當我做一個使用該控制器GET後跟一個POST ...

@Controller 
@RequestMapping("/myPage*") 
@SessionAttributes(value = {"object1", "object2"}) 
public class MyController { 

    @RequestMapping(method = RequestMethod.GET) 
    public String get(Model model) { 
     model.addAttribute("object1", new Object1()); 
     model.addAttribute("object2", new Object2()); 
     return "myPage"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String post(@ModelAttribute(value = "object1") Object1 object1) { 
     //do something with object1 
     return "myPage"; 
    } 
} 

...對象2會從模型清除。它不再作爲@SessionAttribute存在,並且無法在我的視圖頁面上訪問。

但是,如果第二個方法的簽名修改成這樣...

public String post(@ModelAttribute(value = "object1") Object1 object1, 
        @ModelAttribute(value = "object2") Object2 object2) { 

...那麼對象2不會被從模型中清除,可我的視圖頁面上。

爲@SessionAttributes的Javadoc說:

...屬性將被刪除,一旦 處理程序指示 了對話會議的完成。

但我不明白我是如何表示第一個例子中會話會話的完成,但在第二個例子中沒有。

任何人都可以解釋這種行爲還是一個錯誤?

+0

這個問題現在已經在Spring 3.0RC1解決。見http://jira.springsource.org/browse/SPR-6084謝謝Juergen! – 2009-09-25 08:15:16

回答

14

通過調用

SessionStatus.setComplete

public void post(...., SessionStatus status) { 
    status.setComplete(); 
} 

這就是說指示談話結束後,我不知道你爲什麼要失去一個模型屬性,而不是其他。

您是否嘗試過做類似:

@ModelAttribute("object1") 
public Object object1() { return new Object(); } 

@ModelAttribute("object2") 
public Object object2() { return new Object(); } 

而且看到如何比較用手把屬性模型。

+1

我試過你的建議 - 而且令人驚訝的是它的工作原理!現在我真的很困惑。爲什麼手動設置模型屬性並使用@ModelAttribute設置它有什麼不同? – 2009-09-03 07:10:31

+2

唉,我做了一個噓聲。從引用(3.0.0.M3)開始:「注意:@ModelAttribute註釋的方法將在所選的@RequestMapping註釋處理程序方法之前執行」。所以原因是,object1和object2方法在get方法和post方法之前執行。這可能實際上是你想要的,但我懷疑不是。 – ptomli 2009-09-03 09:33:20

+0

是的,我意識到剛發佈我的評論後。我可能會用Spring提出這個問題,因爲我沒有看到這種行爲的合理解釋。 – 2009-09-06 22:26:55

1

您可以刪除單個會話級別的ModelAttribute這樣的:

鑑於ModelMap modelHttpSession session和你做:

if (categoryId != null) 
    model.addAttribute("categoryId", categoryId); 
else { 
    model.remove("categoryId"); 
    session.removeAttribute("categoryId"); 
} 
相關問題