2011-06-14 52 views
2

我剛剛意識到我的嚮導組件忘記了過去的步驟,因爲我正在使用@RequestScoped嚮導支持bean。使用@SessionScoped可以工作,但很難看。 因此,我試圖讓它使用@ConversationScoped工作,但必須實現一些奇怪的效果。 (也許出來的J2EE經驗)CDI對話和primefaces嚮導組件

鑑於這種嚮導的支持bean:

@Named 
@RequestScoped 
public class EvaluationWizard implements Serializable { 
    ... 
    @Inject 
    private Conversation conversation; 

    @Inject 
    private Song selectedSong; 
    ... 
    public void setSelectedSong(final Song song) { 
     selectedSong = song; 
    } 

    public Song getSelectedSong() { 
     return selectedSong; 
    } 

    public void onDialogOpen(final ActionEvent actionEvent) { 
     conversation.begin(); 
    } 

    public void onDialogClose(final CloseEvent closeEvent) { 
     conversation.end(); 
    } 
    ... 
} 

我的歌物體看起來是這樣的:

@Named 
@ConversationScoped 
public class Song extends SelectItem implements Serializable { 

    private String title; 

    public void setTitle(final String title) { 
     this.title = title; 
    } 

    @Override 
    public String toString() { 
     return title; 
    } 
} 

嚮導包含爲了把事情幾個步驟向上。 selectedSong屬性是列表中的一個項目,表示當前選擇的歌曲。 這個選擇被保存在「EvaluationWizard」支持bean中,我的調試確認了這種情況 - 但只有一個嚮導步驟的情況。

對此的任何幫助將非常感激。

問候,馬塞爾。

回答

1

Primefaces嚮導組件無法與RequestScoped bean一起使用,這是正確的。您必須使用@SessionScoped@ViewScoped

我個人喜歡使用ViewScoped,因爲當您導航到頁面時會創建bean,並在您離開頁面時死掉。這給你一個持久bean的好處,而不會混淆會話。

+0

謝謝 - 我想只有一個富客戶端ajax-only頁面,沒有進一步的位置變化發生。默認的CDI實現不提供ManagedBean方法附帶的ViewScope。所以我決定看看Seam 3和它的「Faces」模塊,它使用ViewScoped擴展了CDI。完成後,我根據請求從RequestScoped更改爲ViewScoped,但現在嚮導狀態一旦加載就保持不變。 (感覺像SessionScoped)會話開始並正確停止,但ConversationScoped bean始終保持不變。 – Marcel 2011-06-19 10:08:07

0

是@RequestScoped不起作用。直到今天,我們還使用了@SessionScoped。今天我瞭解到,最好使用@ViewAccessScoped,因爲與@SessionScoped相比,您獲得了窗口隔離。在我們的應用程序中,我們得到了很多由@SessionScoped引起的錯誤。我用@ViewAccessScoped取代了它,我用它在10分鐘內解決了17張不同的門票。