java.lang.IllegalStateException: getOutputStream() has already been called for this response
阿新 • • 發佈:2019-02-14
報錯原因:
當使用 javax.servlet.ServletResponse.getOutputStream() 方法獲取 ServletOutputStream 物件;
又再使用 javax.servlet.ServletResponse.getWriter() 方法獲取 PrintWriter 物件時就會報錯.
原始碼片段: org.apache.catalina.connector.Response
/** Using output stream flag. **/ protected boolean usingOutputStream = false; @Override public ServletOutputStream getOutputStream()throws IOException { if (usingWriter) { throw new IllegalStateException(sm.getString("coyoteResponse.getOutputStream.ise")); } // 當獲取 ServletOutputStream 物件時, 會把 usingOutputStream 成員變數設定為 true. usingOutputStream = true; if (outputStream == null) { outputStream = new CoyoteOutputStream(outputBuffer); } return outputStream; } @Override public PrintWriter getWriter()throws IOException { // 如果已經通過 getOutputStream() 方法獲取 ServletOutputStream 物件了, usingOutputStream = true if (usingOutputStream) { throw new IllegalStateException(sm.getString("coyoteResponse.getWriter.ise")); } if (ENFORCE_ENCODING_IN_GET_WRITER) { /* * If the response's character encoding has not been specified as * described in <code>getCharacterEncoding</code> (i.e., the method * just returns the default value <code>ISO-8859-1</code>), * <code>getWriter</code> updates it to <code>ISO-8859-1</code> * (with the effect that a subsequent call to getContentType() will * include a charset=ISO-8859-1 component which will also be * reflected in the Content-Type response header, thereby satisfying * the Servlet spec requirement that containers must communicate the * character encoding used for the servlet response's writer to the * client). */ setCharacterEncoding(getCharacterEncoding()); } usingWriter = true; outputBuffer.checkConverter(); if (writer == null) { writer = new CoyoteWriter(outputBuffer); } return writer; }