2013-02-26 126 views
1

我想盡可能優雅地處理我的web應用程序中的錯誤。
當然,我已經RTFM並添加以下到我的web.xml文件:ZK錯誤處理:在初始請求期間與AJAX請求

<!-- WEB-INF/web.xml --> 
<error-page> 
    <exception-type>java.lang.Throwable</exception-type>  
    <location>/error.zul</location>  
</error-page> 

這是基本的Java webapp error handling偉大工程。作爲ZK是一個AJAXy框架,頁面已經呈現後,可能會被拋出一個錯誤,因此ZK提供它自己的錯誤處理,這也:

<!-- zk.xml --> 
<error-page> 
    <exception-type>java.lang.Throwable</exception-type>  
    <location>/zk/common/error.zul</location>  
</error-page> 

這個偉大的工程也,但是,他們沒有發揮好。當AU請求期間時引發的錯誤,ZK錯誤消息顯示,因爲它應該但我得到以下到stderr:再次

Feb 26, 2013 10:37:04 PM org.zkoss.zk.ui.http.DHtmlLayoutServlet handleError:273 
WARNING: Failed to load the error page: /zk/common/error.zul 
java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    at org.apache.catalina.connector.Response.getWriter(Response.java:611) 
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198) 
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.process(DHtmlLayoutServlet.java:168) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.handleError(DHtmlLayoutServlet.java:267) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.doGet(DHtmlLayoutServlet.java:138) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.doPost(DHtmlLayoutServlet.java:149) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551) 
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:416) 
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:680) 
Feb 26, 2013 10:37:04 PM org.apache.catalina.core.ApplicationDispatcher invoke 
SEVERE: Servlet.service() for servlet auEngine threw exception 
java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    at org.apache.catalina.connector.Response.getWriter(Response.java:611) 
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198) 
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) 
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) 
    at org.zkoss.web.servlet.dsp.ServletDspContext.getOut(ServletDspContext.java:113) 
    at org.zkoss.web.servlet.dsp.impl.TextNode.interpret(TextNode.java:44) 
    at org.zkoss.web.servlet.dsp.impl.RootNode.interpret(RootNode.java:51) 
    at org.zkoss.web.servlet.dsp.impl.RootNode.interpret(RootNode.java:60) 
    at org.zkoss.web.util.resource.DspExtendlet.service(DspExtendlet.java:92) 
    at org.zkoss.web.util.resource.ClassWebResource.web0(ClassWebResource.java:583) 
    at org.zkoss.web.util.resource.ClassWebResource.web(ClassWebResource.java:569) 
    at org.zkoss.web.util.resource.ClassWebResource.service(ClassWebResource.java:260) 
    at org.zkoss.zk.au.http.DHtmlUpdateServlet.doGet(DHtmlUpdateServlet.java:392) 
    at org.zkoss.zk.au.http.DHtmlUpdateServlet.doPost(DHtmlUpdateServlet.java:464) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551) 
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) 
    at org.zkoss.web.servlet.Servlets.include(Servlets.java:882) 
    at org.zkoss.zk.ui.http.Utils.handleError(Utils.java:143) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.handleError(DHtmlLayoutServlet.java:278) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.doGet(DHtmlLayoutServlet.java:138) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.doPost(DHtmlLayoutServlet.java:149) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551) 
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:416) 
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:680) 
Feb 26, 2013 10:37:04 PM org.apache.catalina.core.ApplicationDispatcher invoke 
SEVERE: Servlet.service() for servlet zkLoader threw exception 
java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    at org.apache.catalina.connector.Response.getWriter(Response.java:611) 
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198) 
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) 
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) 
    at org.zkoss.web.servlet.dsp.ServletDspContext.getOut(ServletDspContext.java:113) 
    at org.zkoss.web.servlet.dsp.impl.TextNode.interpret(TextNode.java:44) 
    at org.zkoss.web.servlet.dsp.impl.RootNode.interpret(RootNode.java:51) 
    at org.zkoss.web.servlet.dsp.impl.RootNode.interpret(RootNode.java:60) 
    at org.zkoss.web.util.resource.DspExtendlet.service(DspExtendlet.java:92) 
    at org.zkoss.web.util.resource.ClassWebResource.web0(ClassWebResource.java:583) 
    at org.zkoss.web.util.resource.ClassWebResource.web(ClassWebResource.java:569) 
    at org.zkoss.web.util.resource.ClassWebResource.service(ClassWebResource.java:260) 
    at org.zkoss.zk.au.http.DHtmlUpdateServlet.doGet(DHtmlUpdateServlet.java:392) 
    at org.zkoss.zk.au.http.DHtmlUpdateServlet.doPost(DHtmlUpdateServlet.java:464) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551) 
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) 
    at org.zkoss.web.servlet.Servlets.include(Servlets.java:882) 
    at org.zkoss.zk.ui.http.Utils.handleError(Utils.java:143) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.handleError(DHtmlLayoutServlet.java:278) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.doGet(DHtmlLayoutServlet.java:138) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.doPost(DHtmlLayoutServlet.java:149) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551) 
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:416) 
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:680) 
Feb 26, 2013 10:37:04 PM org.apache.catalina.core.StandardHostValve custom 
SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Throwable, location=/error.zul] 
java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    at org.apache.catalina.connector.Response.getWriter(Response.java:611) 
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198) 
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) 
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) 
    at org.zkoss.web.servlet.dsp.ServletDspContext.getOut(ServletDspContext.java:113) 
    at org.zkoss.web.servlet.dsp.impl.TextNode.interpret(TextNode.java:44) 
    at org.zkoss.web.servlet.dsp.impl.RootNode.interpret(RootNode.java:51) 
    at org.zkoss.web.servlet.dsp.impl.RootNode.interpret(RootNode.java:60) 
    at org.zkoss.web.util.resource.DspExtendlet.service(DspExtendlet.java:92) 
    at org.zkoss.web.util.resource.ClassWebResource.web0(ClassWebResource.java:583) 
    at org.zkoss.web.util.resource.ClassWebResource.web(ClassWebResource.java:569) 
    at org.zkoss.web.util.resource.ClassWebResource.service(ClassWebResource.java:260) 
    at org.zkoss.zk.au.http.DHtmlUpdateServlet.doGet(DHtmlUpdateServlet.java:392) 
    at org.zkoss.zk.au.http.DHtmlUpdateServlet.doPost(DHtmlUpdateServlet.java:464) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551) 
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) 
    at org.zkoss.web.servlet.Servlets.include(Servlets.java:882) 
    at org.zkoss.zk.ui.http.Utils.handleError(Utils.java:143) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.handleError(DHtmlLayoutServlet.java:278) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.doGet(DHtmlLayoutServlet.java:138) 
    at org.zkoss.zk.ui.http.DHtmlLayoutServlet.doPost(DHtmlLayoutServlet.java:149) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551) 
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:416) 
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:680) 

,這是當ZK特定錯誤處理程序(在/zk/common/error.zul)截獲該錯誤。根據堆棧跟蹤,似乎錯誤傳播到普通的Java webapp錯誤處理程序(在/error.zul處)。

如果第一次呈現頁面時發生錯誤,則會按預期方式顯示普通錯誤處理程序(位於/error.zul)而不是頁面,並且不記錄任何問題。

有關如何解決此問題的任何想法? 可以/我應該在我的ZK錯誤處理程序上做些什麼來阻止錯誤傳播?

回答

0

您可以使用Initiator來處理ZK Loader呈現頁面時發生的異常。使用的標籤是

<?init class="com.foo.MyInitial"?> 

您需要實施Initiator

希望這會有所幫助。

參考:Link