JSF SessionScoped managedBean в сочетании с ViewScoped managedBean - PullRequest
1 голос
/ 10 января 2012

У меня есть следующая проблема в моем проекте:

У нас есть 2 управляемых bean-компонента со следующей конфигурацией:

@ManagedBean
@SessionScoped
public class SessionBean {
    private PersonnelFile personnelFile; // + getters/setters
}

@ManagedBean
@ViewScoped
public class ViewBean {
    @ManagedProperty("#{sessionBean}")
    private SessionBean sessionBean;

    public void selectPersonnel() {
        sessionBean.getPersonnelFile().setPerson(new Person());
    }
}

Это не весь код, но он дает вам общее представление о ситуации:

  • SessionScoped bean-компонент, содержащий объект сеанса
  • Компонент ViewScoped, который содержит связанные с видом объекты и ссылку на компонент SessionScoped

Теперь проблема:

  • Я получаю доступ к своему виду
  • Я делаю несколько постбэков к одному и тому же виду, возвращаясь к нему каждый раз ... пока все хорошо
  • В определенный момент я устанавливаю свой объект сеанса в бине SessionScoped с информацией из представления, и я покидаю свой вид ... пока все хорошо
  • Теперь, когда я возвращаюсь к этому представлению, он создает новый экземпляр компонента ViewScoped (как и ожидалось) и возвращает обратно компонент EJB SessionScoped (из-за аннотации ManagedProperty)
  • Когда я отлаживаю это, я вижу, что ссылка на bean-компонент SessionScoped остается неизменной, поэтому это тот же объект
  • Однако объект, который я ранее установил в bean-компоненте SessionScoped, стал null, что означает, что он «потерял» информацию сеанса об этом объекте
  • Я никогда не сбрасывал этот объект в bean-компоненте SessionScoped, поэтому не вижу, где он мог пойти не так ...

Если вам нужно больше объяснений или вы хотите, чтобы я лучше сформулировал этот вопрос, дайте мне знать или используйте кнопку редактирования!

1 Ответ

0 голосов
/ 11 января 2012

@ BalusC Я думаю, что мы, возможно, нашли проблему. В нашем файле web.xml мы использовали следующую настройку:

 <context-param>
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
     <param-value>client</param-value>
 </context-param>

Теперь, если я правильно понимаю, мы не можем редактировать состояние bean-объекта сессионной области с помощью bean-объекта scoped с этой настройкой ... Единственный способ, которым мы смогли изменить состояние сеанса bean-объект, находится в конструкторе или в методе PostConstruct самого компонента. Изменения, внесенные в bean-объект области видимости изнутри bean-объекта видимости, не были сохранены на сервере.

Если мы установим эту переменную на «сервер», то состояние действительно сохраняется на сервере и не передается клиенту каждый раз. Я понимаю, что это увеличивает нагрузку на сервер с точки зрения памяти, но я хотел бы знать, как мы могли бы решить нашу проблему с помощью подхода client.

Итак, моя проблема исправлена, но я не уверен, что решение идеально ...

...