【问题标题】:Primefaces fileDownload warning SRTServletResponse cannot set statusPrimefaces 文件下载警告 SRTServletResponse 无法设置状态
【发布时间】:2019-01-14 04:25:32
【问题描述】:

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

<p:commandButton id="xlsExport" value="Export XLS"
    ajax="false"
    onclick="PrimeFaces.monitorDownload(startPleaseWaitMonitor, stopPleaseWaitMonitor);">
    <p:fileDownload value="#{SampleBean.XLSExport}" />
</p:commandButton>

SampleBean 有以下方法:

public StreamedContent getXLSExport() {
    ...
    byte[] content = generator.generateXLS();
    return new DefaultStreamedContent(new ByteArrayInputStream(content), "application/vnd.ms-excel", fileName, "UTF-8");
}

我在两台应用服务器上使用它——JBoss 和 Websphere。如果是 Websphere,我在导出时会在服务器日志中看到警告:

000000f5 SRTServletRes W com.ibm.ws.webcontainer.srt.SRTServletResponse setStatus 警告: 无法设置状态。响应已提交。

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

出现这种日志警告的原因可能是什么?

【问题讨论】:

  • CSV 的“类似”方法有效,那么 IS 有什么区别? “应用程序/vnd.ms-excel”与其他东西?
  • 只是内容类型:application/csv
  • 您使用的是哪个 WebSphere 版本?
  • 我在 WAS 9.0

标签: jsf primefaces websphere


【解决方案1】:

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

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

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

解决此警告消息的一个简单方法是在尝试更改其状态之前检查响应是否已提交。我为此打开了一个 PrimeFaces 问题:https://github.com/primefaces/primefaces/issues/3955

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

【讨论】:

  • 对调查的赞美。这确实可以解释为什么我从未在 Wildfly 7 或 10 上注意到它。W
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
相关资源
最近更新 更多