Это известная проблема, о которой вы действительно сообщаете как проблема 2215 .Это произойдет, если буфер ответов переполнен (из-за большого содержимого), и ответ будет зафиксирован до создания сеанса.Это является результатом чрезмерно усердных попыток Мохарры максимально отложить «ненужное» создание сеанса (хотя это само по себе хорошо).
Пока они не исправят это, есть несколько обходных путей:
Создайте Filter
, что делает HttpServletRequest#getSession()
до FilterChain#doFilter()
.Преимущество: нет необходимости изменять конфигурацию / код JSF.Недостаток: когда вы также хотите избежать ненужного создания сеанса.
Вызов ExternalContext#getSession()
с true
в конструкторе (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
.Преимущество: сессия не будет создана вообще, если у вас нет сессионных компонентов.Это также немедленно решает потенциальные ViewExpiredException
случаев.Недостаток: увеличение пропускной способности сети.Если вы используете частичное сохранение состояния, то влияние должно быть минимальным.
Относительно того, почему проблема исчезает при удалении <h:form>
, это связано с тем, что сеанс не требуетсясоздан для хранения состояния просмотра.
Обновление : в соответствии с дубликатом проблема 2277 была исправлена начиная с Mojarra 2.1.8.Таким образом, вы также можете просто обновить хотя бы до этой версии.