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