Jsf Primefaces文件下载警告SRTServletResponse无法设置状态

Jsf Primefaces文件下载警告SRTServletResponse无法设置状态,jsf,primefaces,websphere,Jsf,Primefaces,Websphere,我使用Primefaces在JSF中提供文件下载操作。我使用的代码是: <p:commandButton id="xlsExport" value="Export XLS" ajax="false" onclick="PrimeFaces.monitorDownload(startPleaseWaitMonitor, stopPleaseWaitMonitor);"> <p:fileDownload value="#{SampleBean.XLSExpo

我使用Primefaces在JSF中提供文件下载操作。我使用的代码是:

<p:commandButton id="xlsExport" value="Export XLS"
    ajax="false"
    onclick="PrimeFaces.monitorDownload(startPleaseWaitMonitor, stopPleaseWaitMonitor);">
    <p:fileDownload value="#{SampleBean.XLSExport}" />
</p:commandButton>
我在两个应用服务器上使用它——JBoss和Websphere。对于Websphere,我在导出时在服务器日志中看到警告:

000000 F5 SRTServletRes W com.ibm.ws.webcontainer.srt.SRTServletResponse setStatus警告: 无法设置状态。答复已经提交

当我运行类似的方法,但CSV导出没有警告。对于JBoss,也没有任何警告


出现此类日志警告的原因可能是什么?

我已在本地重新创建了此警告-PrimeFaces的
FileDownloadActionListener
似乎正在尝试在服务器提交响应后设置响应状态代码。FileDownload代码获取响应输出流,将下载文件的全部内容写入其中,然后尝试更新响应状态代码

当传递到响应缓冲区的数据量超过某个阈值(默认为32K)时,WebSphere提交并刷新响应。一旦提交了响应,其头(例如状态代码)就无法更新。其他应用程序服务器在这里的行为可能与此相同-它们可能不会记录警告消息。在这种特殊情况下,不必担心警告,因为FileDownload代码只是试图从200->200更新状态代码

使用不同的内容类型(如
CSV
)在这里不会有什么不同。文件大小确实会产生影响-如果下载的文件小于响应缓冲区大小,则在PrimeFaces代码尝试设置其状态之前,不会提交响应

此警告消息的一个简单修复方法是在尝试更改其状态之前检查响应是否已提交。我已经为此打开了一个PrimeFaces问题:


更新:我为PrimeFaces提供了一个修复程序,因此您不应该在夜间构建/下一版本中再看到它。

CSV的“类似”方法有效,那么有什么区别呢?“application/vnd.ms excel”与其他内容相比?只是内容类型:application/csv您使用的是什么WebSphere版本?我使用的是WAS 9.0,用于调查。这也许可以解释为什么我从来没有在Wildfly 7或10上注意到它。W
public StreamedContent getXLSExport() {
    ...
    byte[] content = generator.generateXLS();
    return new DefaultStreamedContent(new ByteArrayInputStream(content), "application/vnd.ms-excel", fileName, "UTF-8");
}