JFinal

登录 注册

后台使用renderJson("");后抛出异常getOutputStream() has already been called for this response

前端是用post/ajax/window.location去请求都会抛出这个异常。

后台action里面是做一个流的处理,将输入放入流中进行下载操作。

代码:

前端请求:

window.location=url; 

或者

$.post(url, data,function(res){});

$.post(url, data);

后台:

image.png

后台中,使用了ajax或post请求的话好像这句话renderJson("");有影响,然后抛出image.png

如果直接使用window.location=url; ,后台renderJson("");也会抛出这个异常,如果我把这个去掉就不会出现这种情况。我想知道为什么?

目前我只能用window.location=url; 去请求后台。如果我使用了post和ajax的话需要加上renderJson("");,这样的话就会抛出上面的异常,如果我把renderJson("");去掉,可以进到后台,但是前段就没反应了?求大佬指教!!!

评论

  • 07-18 15:53
    你自己的代码已经 getOutputStream() 一次,然后 renderJson("") 会调用 JsonRender.render(...) 方法,该方法中也会 getOutputStream() ,所以出现这个异常才是对的

    避免的办法很简单,要么去掉你自己的 getOutputStream() , 要么去掉 renderJson()

    我看到你的代码中还有一个 renderNull(), 为啥不在 renderNull() 后面 return 一下,避免后面的 renderJson("") 被调用
  • 12-03 17:26
    @JFinal 波总 这个问题 真的经常遇到 代码里需要 getOutputStream()这个方法 但是同时也需要render() 这个错还一直报........... 怎么彻底解决啊,或者 下一个jfinal版本更新给解决一下?
  • 12-03 17:26
    @JFinal 不能说不让同时用这个方法吧
  • 12-03 17:37
    @messi_zhm 用最新版本的 jfinal 3.5 就好,这个版本 jfinal 在 render 中不再 close() 连接,只 flush() 一下
  • 12-03 17:54
    @JFinal 现在项目不太方便更新版本 有什么临时解决办法吗
  • 12-03 18:08
    @messi_zhm 做一个 MyRender 继承一下你现在用到的 render , 例如 JsonRender
    public class MyRender extends JsonRener ,添加 render() 方法,照抄 JsonRender 中的 render 代码,然后去掉 close() 那行代码

    最后,用 RenderFactory 切换到自己的实现上去:
    public class MyRenderFactory extends RenderFactory {
    public Render getJsonRender(...) {
    // 关键是这里
    return new MyJsonRender(...);
    }
    }

    最后配置一下:
    me.setRenderFactoru(new MyRenderFactory());

    上面三步,可以将 renderJson 的行为切换到自己 的 MyRender 上去,从而实现去掉 close() 的目的

    最后,建议升级到最新版本


    还有一个简单的办法是引入一个 BaseController,在其中覆盖 renderJson(...) 方法,变成
    public void renderJson(...) {
    render(new MyJsonRender(...));
    }

    然后你所有 contrller 继承自这个 BaseController 即可切换
  • 12-03 18:18
    @JFinal 恩恩 谢谢 波总
  • 发送