java.lang.IllegalStateException:使用Jetty和struts编写excel文件作为响应时的STREAM

Avi*_*Avi 3 java struts2 jetty

我有一个使用struts和jetty创建excel文件的代码.

在我声明的struts.xml文件中:

<action name="full-export-excel" method="exportFullDataSetToExcel"
        class="com.me.ExcelAction">
  <result name="success" type="stream">
    <param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8
    </param>
    <param name="inputName">input</param>
    <param name="contentLength">${contentLength}</param>
    <param name="bufferSize">1024</param>
    <param name="contentDisposition">filename="${fileName}"</param>
  </result>
</action>
Run Code Online (Sandbox Code Playgroud)

在我的java代码中:

final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
XSSFWorkbook excelWorkBook = excelBuilder.createExcelWorkBook(reportObjects, columnMapper); // My code for creating excel file
excelWorkBook.write(outputStream);
input = new ByteArrayInputStream(outputStream.toByteArray());
Run Code Online (Sandbox Code Playgroud)

我也有内容长度的getter:

public Integer getContentLength() throws IOException {
  return input.available();
}
Run Code Online (Sandbox Code Playgroud)

整个代码在码头下运行.在尝试下载大文件时,我得到以下异常:

Caused by: java.lang.IllegalStateException: STREAM
    at org.eclipse.jetty.server.Response.getWriter(Response.java:944)
    at org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper.getWriter(CompressedResponseWrapper.java:440)
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:152)
Run Code Online (Sandbox Code Playgroud)

编辑:它适用于较小的excel文件,但不适用于大型文件.我还尝试将大文件写入文件系统(以确保不是excel导出而是通信问题)并且它有效.

Joa*_*elt 15

例外......

Caused by: java.lang.IllegalStateException: STREAM
    at org.eclipse.jetty.server.Response.getWriter(Response.java:944)
    ...
Run Code Online (Sandbox Code Playgroud)

...表示您的代码在访问HttpServletResponse.getWriter()后尝试访问HttpServletResponse.getOutputStream()

.getWriter()呼叫发生的时间点,响应的状态已经处于STREAM模式,因此IllegalStateException

根据servlet规范,这是不允许的.

  • 这对我来说不是问题。这是由于引发了异常并尝试执行 `getOutputStream()` 而造成的,这混淆了我的真正问题。我接受了答案,因为我认为这将使其他人受益,甚至认为这不是我原来的问题:) 谢谢! (3认同)
  • @AndreaLigios我的问题是客户端请求超时并取消了请求.在服务器端有一个名为`getWriter()`的异常处理程序,并在调用`getOutputStream()`之后更改了响应(完全如本答案中所述).日志给出了这个例外,但根本原因是客户端取消了请求.由于我们处理异常的方式,它被IllegalStateException混淆了.鉴于我的问题,Joakim的答案是对我如何提出问题的完整答案.所以我接受了它. (3认同)