CDI对话和primefaces向导组件

CDI对话和primefaces向导组件,primefaces,cdi,wizard,Primefaces,Cdi,Wizard,我刚刚意识到,当我使用@RequestScope向导支持bean时,我的向导组件忘记了过去的步骤。使用@SessionScoped会起作用,但很难看。 因此,我试图使用@ConversationScope使其工作,但不得不意识到一些奇怪的效果。(可能没有J2EE经验) 给定这种向导支持bean: @Named @RequestScoped public class EvaluationWizard implements Serializable { ... @Inject

我刚刚意识到,当我使用@RequestScope向导支持bean时,我的向导组件忘记了过去的步骤。使用@SessionScoped会起作用,但很难看。 因此,我试图使用@ConversationScope使其工作,但不得不意识到一些奇怪的效果。(可能没有J2EE经验)

给定这种向导支持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中,我的调试确认了这一点——但这只是一个向导步骤的情况

在这方面的任何帮助都将不胜感激


您好,Marcel。

Primefaces向导组件将无法与RequestScoped bean一起工作。您是对的。您必须使用
@SessionScoped
@ViewScoped


我个人喜欢使用ViewScoped,因为bean将在导航到页面时创建,而在离开页面时会消失。这为您提供了持久化bean的好处,而不会使会话混乱。

Yes@RequestScoped将不起作用。直到今天,我们还使用了@SessionScoped。今天我学到了使用@ViewAccessScope更好,因为与@SessionScope相比,您可以获得窗口隔离。在我们的应用程序中,我们发现了许多由@SessionScoped引起的bug。我刚刚用@viewAccessScope替换了它,并用它在10分钟内解决了17个不同的问题。

谢谢-我希望只有一个富客户端ajax专用页面,没有进一步的位置更改。默认CDI实现不提供ManagedBean方法附带的ViewScope。所以我决定看看Seam 3及其“Faces”模块,它通过ViewScope扩展了CDI。这样做之后,我根据请求从RequestScope更改为ViewScope,但现在向导状态在加载后保持不变。(感觉像SessionScoped)对话正确启动和停止,但ConversationScoped bean始终保持不变。