Внедренный компонент сеанса с областью действия в представлении Дублирование компонента с областью действия

У меня есть bean-компонент ViewScoped, и в этот bean-компонент я ввожу bean-компонент SessionScoped. Об этом можно найти много информации, и она довольно прямолинейна.

Сеансовый компонент

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class Following implements Serializable {
    private HashMap<Integer, ArrayList<String>> followingThese;

    //Constructors and getters+setters
    ...
}

Просмотреть компонент

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.ResourceBundle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UICommand;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

@ManagedBean
@ViewScoped
public class DisplayResults implements Serializable {

    // Following Bean
    @ManagedProperty(value = "#{following}")
    private Following followingBean;

    // other information...
    ...

    //*and this is how this injected bean is used*
    public void startStopFollowing(int id, name) {
         followingBean.startStopFollowing(id, name);  //adds this id to followingThese
    }
}

Фейслет

...
<h:outputText value="#{displayResults.followingBean.followingThese}" id="test"/>
<h:outputText value="#{following.followingThese}" id="test2"/>

...

<h:selectBooleanCheckbox value="#{results.followed}" immediate="true" 
    valueChangeListener="#{displayResults.startStopFollowing(displayResults.id, displayResults.name)}">
     <f:ajax render=":test :test2"/>
</h:selectBooleanCheckbox>

Интересно, что test обновляется при установке флажка, а test2 — нет. Переменные области сеанса никогда не обновляются. При обновлении страницы я теряю всю информацию, которая была у меня в #{displayResults.followingBean.followingThese}

Изменить: переменная сеанса не обновляется при вызове ajax, только введенная переменная сеанса

Если я изменю javax.faces.STATE_SAVING_METHOD на server, этот код выше сработает, но когда client, ничего. Я теряю всю информацию о своем сеансе, которая была сохранена с помощью bean-компонента ViewScoped.

Изменить Забыл упомянуть. Использование JSF (Majorra) 2.1.6 на Glassfish 3.1.2.2 (только что обновил все, надеясь, что это может решить проблему).

Редактировать №2 Добавлен полный список импорта с кодом выше.

Добавлена ​​информация Попробовав несколько вещей здесь и там, функции, которые я ищу, работают без проблем, если я устанавливаю принимающий компонент на RequestScoped ИЛИ SessionScoped. Это не работает, если установлено значение ViewScoped. Все это было бы красиво и модно, но мне нужны другие функции, которые мне нужны из области представления, и было бы бессмысленно устанавливать мой компонент в область сеанса.

Любая помощь приветствуется.

Редактировать 3

Это было зарегистрировано как ошибка на JIRA


person blo0p3r    schedule 20.09.2012    source источник
comment
Посмотрите логи вашего сервера. Ваш компонент с областью сеанса, вероятно, содержит переменные-члены (которые вы должны были пометить как transient), которые не сериализуемы. В результате отправка содержимого вашего bean-компонента ViewScoped клиенту (в javax.faces.STATE_SAVING_METHOD = client) не удастся.   -  person kolossus    schedule 21.09.2012
comment
@kolossus Просмотрел журналы моего сервера и ничего не нашел. Мой компонент с областью действия сеанса содержит только вспомогательные функции HashMap<Integer, ArrayList<String>>, getter + setter + 3.   -  person blo0p3r    schedule 21.09.2012
comment
@SessionScoped из пакета javax.faces.bean, верно? Если бы это был пакет javax.enterprise.context (CDI), то он не был бы распознан и проигнорирован, а управляемый компонент JSF вел бы себя как @NoneScoped, что подтверждает симптомы, которые вы видите.   -  person BalusC    schedule 21.09.2012
comment
@BalusC Действительно, мой @SessionScoped от javax.faces.bean.SessionScoped. Также убедился, что я использую javax.faces.bean.ManagedBean. Я добавил импорт, используемый в коде вопроса.   -  person blo0p3r    schedule 21.09.2012
comment
Вы смотрели в консоли разработчика вашего браузера? конкретно вид сети? посмотрите, что отправляется туда и обратно для запросов ajax, чтобы убедиться, что представление сериализуется и правильные идентификаторы клиентов отправляются туда и обратно для операций ajax, а также никакие скрытые сообщения FacesMessages не ставятся в очередь для вашей информации.   -  person kolossus    schedule 21.09.2012
comment
@kolossus никаких скрытых FacesMessages. Журнал очищен. Я проверил консоль разработчика браузера, и все в порядке. Боюсь, проблема не в общении. Ситуация такова, что даже без обновления при вызове ajax обновляется только displayResults.followingBean.followingThese. В том же вызове following.followingThese не обновляется. При обновлении все данные теряются. Компонент Session Scoped НИКОГДА не обновляется.   -  person blo0p3r    schedule 21.09.2012
comment
Не могли бы вы реализовать как @PostConstruct, так и @PreDestroy в bean-компоненте SessionScoped и PhaseListener для всех фаз? Таким образом, мы можем видеть, действительно ли компонент уничтожен и когда это происходит.   -  person kolossus    schedule 23.09.2012