后台使用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("");去掉,可以进到后台,但是前段就没反应了?求大佬指教!!!

评论区

JFinal

2018-07-18 15:53

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

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

我看到你的代码中还有一个 renderNull(), 为啥不在 renderNull() 后面 return 一下,避免后面的 renderJson("") 被调用

messi_zhm

2018-12-03 17:26

@JFinal 波总 这个问题 真的经常遇到 代码里需要 getOutputStream()这个方法 但是同时也需要render() 这个错还一直报........... 怎么彻底解决啊,或者 下一个jfinal版本更新给解决一下?

messi_zhm

2018-12-03 17:26

@JFinal 不能说不让同时用这个方法吧

JFinal

2018-12-03 17:37

@messi_zhm 用最新版本的 jfinal 3.5 就好,这个版本 jfinal 在 render 中不再 close() 连接,只 flush() 一下

messi_zhm

2018-12-03 17:54

@JFinal 现在项目不太方便更新版本 有什么临时解决办法吗

JFinal

2018-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 即可切换

messi_zhm

2018-12-03 18:18

@JFinal 恩恩 谢谢 波总

热门反馈

扫码入社