JSF 2 View Expired Weirdest Bug (Update - Происходит при сохранении состояния только на сервере) - PullRequest
4 голосов
/ 26 сентября 2011

Ошибка заключается в следующем - У меня есть несколько форм в моем приложении JSF. Если я активирую вызовы AJAX за пределами определенной формы для 20 или более кликов, я получаю исключение "No Saved View State Could be found for the view identifier".

ОБНОВЛЕНИЕ 1 Это происходит только при сохранении состояния на сервере. Когда эта опция установлена, проблема не возникает:

<context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

КОНЕЦ ОБНОВЛЕНИЯ 1

Например, предположим, у меня есть форма A, форма B, форма C в моем приложении: (Приложение actall очень сложное, я постараюсь донести всю необходимую информацию)

<h:form>
  <h:commandButton value="A">
    <f:ajax render="@form"/>
  <h:commandButton>
<h:form>

<h:form>
  <h:commandButton value="B">
    <f:ajax render="@form"/>
  <h:commandButton>
<h:form>

<h:form>
  <h:commandButton value="C">
    <f:ajax render="@form"/>
  <h:commandButton>
<h:form>

Еще один важный фактор, только одна форма видна в каждый момент времени, другие формы имеют display:none. Наконец, все бины имеют сессионную область.

Теперь следующие клики вызовут исключение (для каждой строки последний клик вызывает исключение)

  1. Ax20, B
  2. Ax19, B, C
  3. Ax10, Cx10, B
  4. Bx5, Cx5, Bx5, Cx5, A

Это не приведет к исключению:

  1. Ax18, B, C, A.

Другими словами, если кнопка в форме не была нажата в течение последних 20 щелчков, то при следующем щелчке выдается исключение No save view state.
Все кнопки в одной форме эквивалентны форме, то есть, если form A имеет кнопки A1 и A2, то следующее не вызовет исключение:

  1. A1x20, A2
  2. A1x19, B, A2
  3. A1, A2x20, B, A1

Есть идеи?!? Это сводит меня с ума.

1 Ответ

5 голосов
/ 26 сентября 2011

Вы превысили количество просмотров в сеансе с одной страницы.По умолчанию ограничение составляет 15, но настраивается параметром контекста в web.xml.Каждая форма технически является отдельным представлением с собственным состоянием представления.Когда вы непрерывно обновляете ajax одну форму, не затрагивая другие формы, состояние их представления на стороне сервера медленно, но верно истекает.

Сохранение состояния просмотра на стороне клиента действительно решит эту проблему, поскольку ничего всеанс на стороне сервера будет сохранен.Это только делает размер ответа немного больше (однако пропускная способность сегодня дешева).

Если вы хотите сохранить состояние просмотра на стороне сервера, то вам следует render другие формы из одной формы ajaxа также, чтобы их состояние просмотра также было обновлено:

<h:form id="A">
  <h:commandButton value="A">
    <f:ajax render="@form :B :C"/>
  <h:commandButton>
<h:form>

<h:form id="B">
  <h:commandButton value="B">
    <f:ajax render="@form :A :C"/>
  <h:commandButton>
<h:form>

<h:form id="C">
  <h:commandButton value="C">
    <f:ajax render="@form :A :B"/>
  <h:commandButton>
<h:form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...