Компонент мастера разговоров CDI и простых лиц - PullRequest
2 голосов
/ 14 июня 2011

Я только что понял, что мой компонент мастера забывает шаги, которые лежали в прошлом, когда я использую компонент поддержки @RequestScoped wizard. Использование @SessionScoped будет работать, но безобразно. Таким образом я попытался заставить это работать, используя @ConversationScoped, но должен был понять некоторый странный эффект. (возможно из опыта J2EE)

С учетом этого вида волшебного бина:

@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, и моя отладка подтверждает, что это так, но это относится только к одному шагу мастера.

Любая помощь по этому вопросу будет очень признательна.

Привет, Марсель.

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Компонент мастера Primefaces не будет работать с компонентами RequestScoped, которые вы указали правильно. Вы должны использовать @SessionScoped или @ViewScoped.

Мне лично нравится использовать ViewScoped, поскольку бин будет создан при переходе на страницу и умрет, когда вы покинете страницу. Это дает вам преимущество постоянного бина, не загромождая сеанс.

0 голосов
/ 19 августа 2011

Да @RequestScoped не будет работать.До сегодняшнего дня мы также использовали @SessionScoped.Сегодня я узнал, что лучше использовать @ViewAccessScoped, потому что вы получаете изоляцию окна по сравнению с @SessionScoped.В нашем приложении мы получили много ошибок, вызванных @SessionScoped.Я просто заменил его на @ViewAccessScoped и за 10 минут решил 17 различных заявок.

...