Получение предупреждения от JSF: ответ уже был сделан к тому времени, когда мы попытались установить исходящий файл cookie для вспышки

У меня есть page1.jsf, на этой странице у меня есть commandButton, который помещает объект в ELFlash и перенаправляет на page2.jsf. На этой странице я восстанавливаю объект с помощью ELFlash. Все работает нормально. Но пока пользователь остается в page2.jsf, для каждого запроса ajax tomcat показывает это предупреждающее сообщение:

20/07/2013 09:43:37 com.sun.faces.context.flash.ELFlash setCookie
WARNING: JSF1095: The response was already committed by the time we tried to set the outgoing cookie for the flash.  Any values stored to the flash will not be available on the next request.

Что это значит?

Ответ 1

Я думаю, что проблема может быть связана с http chunking. Решение заключается в увеличении размера буфера ответа. После этого файлы cookie будут установлены правильно, и Flash Scope тоже будет работать.

Используйте этот код:

public class FlashScopeFixerFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // Below line: response.getWriter() must be invoked to buffer size setting work. Just DO NOT touch this!
    response.getWriter();
    HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
    wrapper.setBufferSize(10000000);
    chain.doFilter(request, wrapper);
}

@Override
public void init(FilterConfig arg0) throws ServletException {}
@Override
public void destroy() {}
}

И в web.xml:

<filter>
    <filter-name>FlashScopeFixerFilter</filter-name>
    <filter-class>dk.sd.medarbejderdata.common.FlashScopeFixerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>FlashScopeFixerFilter</filter-name>
    <url-pattern>*.xhtml</url-pattern>
</filter-mapping>

Ответ 2

Вместо использования фильтра, как указано в ответе @Rafal K, вы также можете увеличить размер буфера ответа, установив параметр контекста в web.xml

<!-- increase buffer size to avoid JSF1095 errors -->
<context-param>
    <param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name>
    <param-value>131072</param-value>
</context-param>

Размер указан в байтах и ​​должен быть больше вашей самой большой страницы. Вы можете легко проверить размер своих страниц в Firefox, щелкнув правой кнопкой мыши и выбрав View Page Info.

Ответ 3

Flash, поскольку это должно предполагать, что имя предназначено как своего рода временная концепция контейнера между жизненным циклом jsf. Дело в следующем: объект, хранящийся во вспышке, будет предлагаться пользователю в следующем виде, с которым он столкнется (помните, что jsf следует за mvc), поэтому после "использования" он исчезнет, ​​а именно будет удален.

Я думаю, почему вы получаете такую ​​ошибку, и это не связано непосредственно с mojarra.