2011-06-14 41 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张不同的门票。