您的位置:首页 > 其它

解决getWriter() has already been called for this response异常

2017-09-28 12:25 531 查看


近期,查看公司应用日志系统error错误信息时,发现了大量的nested exception is java.lang.IllegalStateException: getWriter() has
already been called for this response异常。这个错误以前见到过,也解决过。于是想着趁有点空闲,总结下该错误。如有不对,望各位多包容,欢迎交流。


一、应用日志文件中的错误信息


原因分析

IllegalStateException: getWriter() has already been called for this response

        从字面意思不难得出错误原因:HttpServletResponse中的PrintWriter已经被手动调用过了。所以当servlet执行到方法结果处理逻辑时,需要将返回值输出到writer中去,这时发现PrintWriter已经被调用过。于是servlet认为这是使用混乱的逻辑错误,于是抛出错误。

        根本原因:在Controller接口方法中,既手动调用PrintWriter向客户端输出内容,又设置了方法返回值。导致servlet需要两次将结果通过PrintWriter输出到客户端,结果报错。

结果:程序正常返回结果,控制台出现异常。

(返回结果中编码问题,不在本文讨论范围,请忽略)


 


源码佐证


 

 


二、扩展验证附验证结果


验证PrintWriter输出流flush,无返回值

结果:程序正常返回结果,控制台无异常。

(返回结果中编码问题,不在本文讨论范围,请忽略)

 


 


调用ServletOutputStream输出流flush,  无返回值

 

结果:程序正常返回结果,控制台无异常。

 



调用ServletOutputStream输出流flush,又return 返回值

结果:程序返回结果不正常,控制台无异常。

不仅ServletOutputStream输出流中的内容被发送到客户端,而且方法返回结果也输出到客户端。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐