一个很有意思的问题 getWriter() has already been called for this response

背景:

    项目返回数据方式:

         一.基于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).遇到异常直接将异常信息去源码搜索 分析出现的原因

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值