您的位置:首页 > 编程语言 > Java开发

2014.08.20 renderNull() 处理JFinal中的一个异常信息:java.lang.IllegalStateException: Committed

2014-08-20 12:57 453 查看
问题:

下载文件后后台报错:(核心提示)java.lang.IllegalStateException: Committed



问题详细描述:



JFinal中下载文件完成后(文件正常下载),后台报错,但是不影响程序功能。报错很不爽,需要解决。

网友解答:

地址:http://jorton468.blog.163.com/blog/static/72588135201102441617287/

java.lang.IllegalStateException: Committed : 异常表示,当前对客户端的响应已经结束,不能在响应结束后(Committed ),再次向客户端输出任何内容。

解决方式:

在renderFile()之后添加renderNull()方法:如下

renderFile(new File(docfile.getAbsolutePath()), docfile.getName(), getRequest(),getResponse());//下载

renderNull();

原因分析:

下载方法




1.renderFile(new File(docfile.getAbsolutePath()), docfile.getName(), getRequest(),getResponse());//下载

在这段代码执行完成之后,对客户端的response响应的已经完成;

2.程序默认调用render()方法,会将response再次使用,以向客户端发出响应,导致报错;

因为我没有写跳转地址,程序在下载完文件之后,去调用了默认的render()方法,而此时response已经响应结束,故报错。那,如果下载文件后我不跳转,不执行render()方法是否可以解决这个问题呢?

为此,我在文件下载完之后,添加一个renderNull()的方法。果然如此,不再报错。

注意:能够导致响应已经committed的操作包括:forward, redirect, flushBuffer。

JFinal中前后台实现交互后,会调用render()方法,跳转到一个目标地址去,如果不写,则会调用默认的render()方法,如下:

public void render() {

try {

if (isSupportActiveRecord) supportActiveRecord(request);

request.getRequestDispatcher(view).forward(request, response);

} catch (Exception e) {

throw new RenderException(e);

}

}

原因总结:

response是服务端对客户端请求的一个响应,对于当前页面中已经committed(提交)的response,就不能再使用这个response向缓冲区写任何东西,否则会有IllegalStateException的异常。

关于renderNull:

JFinal手册中指出,renderNull表示不向客户端返回数据。

实际使用中会用到renderNull的地方:导出excel、文件下载;

完整错误信息:

2014-08-20 12:31:00

[ERROR]-[Thread: qtp33018164-27]-[com.jfinal.core.ActionHandler.handle()]: /document/documentfile/dl?id=611

com.jfinal.render.RenderException: java.lang.IllegalStateException: Committed

at com.jfinal.render.JspRender.render(JspRender.java:58)

at com.jfinal.core.ActionHandler.handle(ActionHandler.java:92)

at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)

at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1333)

at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:487)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)

at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)

at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)

at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:972)

at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:417)

at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)

at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:906)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)

at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)

at org.eclipse.jetty.server.Server.handle(Server.java:350)

at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:442)

at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:910)

at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:565)

at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217)

at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:46)

at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:545)

at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:43)

at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)

at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)

at java.lang.Thread.run(Thread.java:619)

Caused by: java.lang.IllegalStateException: Committed

at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1069)

at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:199)

at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:98)

at com.jfinal.render.JspRender.render(JspRender.java:56)

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