【问题标题】:Websphere appending error to responseWebsphere 将错误附加到响应
【发布时间】:2016-09-01 14:33:27
【问题描述】:

这里的场景:我正在使用 Struts2 在应用程序上开发新功能,并添加了一个新操作来生成 CSV 文件。在我使用 Tomcat 的测试系统上一切正常,但在使用 Websphere 服务器的 Quality 系统上,文件没问题,但最后,有一个额外的行,包括

Error 500: java.lang.IllegalStateException: Response already committed.

所以问题是,文件生成了,一切都很完美,但是 Tomcat 没有附加错误,Websphere 附加错误。

那么我该如何避免这种情况呢? 这里是主要过程(重要的行):

1- 该操作扩展了一个 org.apache.struts2.s1.Struts1Action 进行转发:

ActionForward forward = action.execute(mapping, actionForm, request, response);

2- 执行操作中的方法,并使用以下行生成响应:

response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment; filename=\"report_"
                + Calendar.getInstance().get(Calendar.YEAR) + ".csv\"");
OutputStream outputStream = response.getOutputStream();
outputStream.write(result.toString().getBytes());
outputStream.flush();
outputStream.close();

3- 父操作完成操作。在某些时候,我得到了这个异常,但它从来没有让我们担心(我们已经生成了其他类型的 excel 报告(xls),但是从来没有遇到过 websphere 将错误附加到响应中的问题):

java.lang.IllegalStateException:getOutputStream() has already been called for this response

所以真正让我感到奇怪的是如何避免 websphere 将错误附加到 csv 文件中......但当然解决方案应该是避免错误,但问题是这个应用程序已经运行了 10 年,而我不应更改已经起作用的东西,但是欢迎对此错误的任何解决方案!

非常感谢你们!!

---编辑---

我真正想知道的是,我怎样才能使用文本文件生成响应,并且之后仍然能够进行所有转发和其他操作。

有什么想法吗?

【问题讨论】:

    标签: tomcat servlets struts2 websphere


    【解决方案1】:

    只是想给你一些想法...希望以下内容有意义...

    首先根据这个sourcejava.lang.IllegalStateException:getOutputStream()的原因是

    简而言之,当您调用 include() 或 forward() 时会出现此错误 提交响应后或通过调用 响应对象上的 getOutputStream()

    Here 是 struts1 下载实现的一个示例(据我了解,您正在为 struts2 使用 struts1 插件)。在那里我们看到execute方法以return null;结束

    因此,可能是,在您从帖子中省略的代码中,有一些转发正在进行,这会导致您出现异常。

    【讨论】:

    • 确实这可能是错误。但我已经在这样做了,如果我不返回 null,它就是行不通的。但是我猜想是意识到如何正确地生成带有文件的响应并让仍然进行转发和所需的一切。我没有发布太多代码的原因是因为我不被允许这样做,所以我只是发布我可以说的“一般内容”。不过还是谢谢你。我再看看。
    • @Carloshf 我真正担心的是,你可能没有return null,而是做一些forwarding。但是,如果没有其余代码,很难理解发生了什么问题。希望您能尽快找到解决方案...
    【解决方案2】:

    好吧,我实际上找到了解决问题的方法,可能不是解决方案本身,而是一种解决方法。

    所以问题是 websphere 附加了错误,因为 Response 内容只是一个字符串。

    所以我所做的是将响应生成为 ByteArray,而不是 String,这样 websphere 就不能附加任何简单的文本,并且 ByteStream 是封闭且安全的。

            byte[] data = result.toString().getBytes();
            ByteArrayOutputStream outStream = new ByteArrayOutputStream(data.length);
            outStream.write(data, 0, data.length);
            response.setContentType("text/csv" + "; charset=UTF-8");
            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            response.setHeader("Pragma", "public");
            response.setHeader("Content-Disposition", "attachment; filename=\"report_"
                        + Calendar.getInstance().get(Calendar.YEAR) + ".csv\"");
    
            response.setContentLength(outStream.size());
            ServletOutputStream responseOutStream = response.getOutputStream();
            outStream.writeTo(responseOutStream);
            outStream.flush();
            outStream.close();
            responseOutStream.flush();
            responseOutStream.close();
    

    如果我解释得不够好,欢迎任何编辑、建议或解释!!

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 2021-12-07
      • 2022-01-08
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多