背景:
项目返回数据方式:
一.基于ObjectMapper,返回方式 response.getWriter();
二.利用@ResponseBody 自动转换成json返回
修改信息使用的是@ResponseBody,修改后刷新列表输出使用的是:response.getWriter() 返回 。
以上两种方式使用出现: getWriter() has already been called for this response
分析:直接贴出源码
源码片段
protected boolean usingOutputStream = false; //OutputStream默认值
protected boolean usingWriter = false;// Writer默认值
public PrintWriter getWriter()
throws IOException {
if (usingOutputStream) {
throw new IllegalStateException
(sm.getString("coyoteResponse.getWriter.ise"));
}
if (ENFORCE_ENCODING_IN_GET_WRITER) {
setCharacterEncoding(getCharacterEncoding());
}
usingWriter = true;
outputBuffer.checkConverter();
if (writer == null) {
writer = new CoyoteWriter(outputBuffer);
}
return writer;
}
public ServletOutputStream getOutputStream()
throws IOException {
if (usingWriter) {
//出现异常位置
throw new IllegalStateException
(sm.getString("coyoteResponse.getOutputStream.ise"));
}
usingOutputStream = true;
if (outputStream == null) {
outputStream = new CoyoteOutputStream(outputBuffer);
}
return outputStream;
}
根据上边两个方法:分析异常出现的原因 肯定是先调用了getWriter()方法 后有调用了getOutputStream()方法
getOutputStream() 是做修改是调用
getWriter()列表时调用
此时得出结论:修改方法返回之前又调用列表导致
此时跟前端确认目前请求方式为:异步接口同步执行
解决方法:先让前端只请求修改方法 让前端修改请求方式同步执行(分先后顺序请求)完美解决
总结:(1).出现此问题反映出一个项目最好统一一种返回数据的方式避免此类的问题
(2).遇到异常直接将异常信息去源码搜索 分析出现的原因