Ответ 1
Это известная проблема, о которой вы действительно сообщили в проблема 2215. Это произойдет, когда буфер ответа переполнится (из-за большого содержимого), и ответ будет выполнен до того, как будет создан сеанс. Это результат чересчур переусердствующих попыток Мохарры отложить "ненужное" создание сессии как можно больше (что само по себе является хорошим делом).
Пока они не будут исправлены, существует несколько способов:
-
Создайте
Filter
, которыйHttpServletRequest#getSession()
передFilterChain#doFilter()
. Преимущество: нет необходимости изменять конфигурацию/код JSF. Недостаток: когда вы тоже хотите избежать ненужного создания сеанса. -
Вызовите
ExternalContext#getSession()
с помощьюtrue
в конструкторе bean (post) илиpreRenderView
. Преимущество: на самом деле, ничего. Недостаток: слишком хаки. -
Добавьте параметр контекста с именем
com.sun.faces.writeStateAtFormEnd
и значениемfalse
вweb.xml
. Преимущество: ненужное создание сеанса будет действительно устранено, в отличие от # 1 и # 2. Недостаток: теперь реакция будет полностью забуферирована в памяти до достижения</h:form>
. Если ваши формы не очень велики, воздействие должно быть минимальным. Тем не менее он все равно потерпит неудачу, если ваш<h:form>
начнет относительно поздно в представлении. Это может быть объединено С# 4. -
Добавьте параметр контекста с именем
javax.faces.FACELETS_BUFFER_SIZE
и значением размера буфера ответа Facelets в байтах (например,65535
для 64 КБ), чтобы весь вывод HTML или, по крайней мере,<h:form>
(см. # 3) вписывается в буфер ответа. Преимущество/недостаток, см. № 3. -
Добавьте параметр контекста с именем
javax.faces.STATE_SAVING_METHOD
и значениемclient
вweb.xml
. Преимущество: сеанс вообще не создается, если у вас нет сеанса beans. Он также немедленно решает потенциальные случаиViewExpiredException
. Недостаток: увеличение использования пропускной способности сети. Если вы используете частичное сохранение состояния, тогда воздействие должно быть минимальным.
В связи с тем, что проблема исчезает, когда вы удаляете <h:form>
, это связано с тем, что сеанс не нужно создавать, чтобы сохранить состояние представления.
Обновление: это соответствует дубликат issue 2277, который был исправлен с Mojarra 2.1.8. Таким образом, вы можете просто обновить, по крайней мере, эту версию.