【问题标题】:getOutputStream() has already been called for this response when using PrintWriter使用 PrintWriter 时已为此响应调用 getOutputStream()
【发布时间】:2019-02-04 15:21:01
【问题描述】:

我正在开发这个 Java Sprint 3.0 应用程序,我在其中将数据传递给数据表。一切正常,但我经常看到这个错误:

ERROR [[dispatcher]] Servlet.service() for servlet dispatcher threw exception
java.lang.IllegalStateException: getOutputStream() has already been called

对此响应。

这是我的代码:

@PreAuthorize("hasRole('ADMIN')")
@RequestMapping(value = "/dataTable", method = RequestMethod.GET)
public void serverSide(Model model, HttpServletRequest request, HttpServletResponse response) throws IOException {

  response.setContentType("application/json");
  response.setHeader("Cache-Control", "no-store");

  PrintWriter out = response.getWriter();
  out.print(dataTableService.viewUsers(request));
}

我已尝试添加以下内容:

out.flush();
out.close();
return;

我也尝试过使用 response.getOutputStream().print(dataTableService.viewUsers(request))response.getWriter()。 append(dataTableService.viewUsers(request)) 而不是使用 PrintWriter 但似乎没有任何解决办法。

编辑:

这里是堆栈跟踪:

【问题讨论】:

  • 你不在调试器中调用那些吗?
  • @Naya 是的,我正在调试模式下运行
  • 你有点滥用 spring,这可能是罪魁祸首:如果发生意外情况,spring 可以预先填写HttpServletResponse。为了解决您的问题,如果您想自己可靠地编写输出,则您的方法需要返回 ResponseEntity - 您还可以编写适当的弹簧视图,设置模型并按照预期返回视图成为
  • @specialist 我对 spring 很陌生,所以我只是按照应用程序中完成的示例进行操作。您能否发布或指出一个示例,因为我真的不知道您在说什么。谢谢!
  • 你能添加更多的堆栈跟踪吗?异常是来自其他地方还是来自您的功能。要考虑的一种情况是 viewUsers 调用抛出异常,spring 试图生成错误页面,但响应流已经被访问

标签: java spring spring-mvc


【解决方案1】:

基础是:

  1. 标题必须先写;
  2. 那么必须使用getOutputStreamgetWriter 编写内容。

还有什么问题:

  • 基本错误,例如同时使用 response.getOutputStream()response.getWriter() - 在这里不太可能发生。

  • 控制流程:

    if (...) {
        ... redirect
        // Missing return
    }
    ... normal output
    
  • 过滤器或拦截器:通常不太可能;虽然这里有注释。

    out.flush(); // OKAY
    // Probably NOT OKAY: out.close();
    
  • 正在使用 Servlet 字段。服务方法本身应该是无状态的。

【讨论】:

  • 感谢您的详细解答。我尝试仅添加 out.flush() 但问题仍然存在。还有其他建议吗?
  • 不知道,@specializt e.a.指出错误的“魔术” Spring 用法。另一个 spring 示例可能会有所帮助。
  • 到目前为止没有任何效果,您还有其他示例吗?
  • 从另一个 Spring 示例开始;尝试返回一个字符串,return(dataTableService.viewUsers(request);。问题是使用 spring 有很多变体,而我没有使用该 servlet near 构造。
  • 不,堆栈跟踪很有趣,因为我今天才看到它。显示了一个 view jsp,因此您的 controller 方法应该只提供表的数据 model。我希望有人能够展示一个最佳实践示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多