CDI会话和primefaces向导组件

时间:2011-06-14 15:29:33

标签: primefaces cdi wizard

我刚刚意识到我的向导组件忘记了过去的步骤,因为我正在使用@RequestScoped向导支持bean。使用@SessionScoped会起作用但很难看。 因此我尝试使用@ConversationScoped使其工作,但必须实现一些奇怪的效果。 (可能超出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();
    }
    ...
}

My Song对象如下所示:

@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中,我的调试确认是这种情况 - 但只有一个向导步骤才会出现这种情况。

对此的任何帮助都会非常感激。

问候,马塞尔。

2 个答案:

答案 0 :(得分:1)

Primefaces向导组件不适用于您正确的RequestScoped bean。您必须使用@SessionScoped@ViewScoped

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

答案 1 :(得分:0)

是@RequestScoped不起作用。直到今天我们还使用了@SessionScoped。今天我了解到最好使用@ViewAccessScoped,因为与@SessionScoped相比,你获得了窗口隔离。在我们的应用程序中,我们遇到了很多由@SessionScoped引起的错误。我只是用@ViewAccessScoped替换它,我用它在10分钟内解决了17张不同的门票。