我正在使用SimpleMappingExceptionResolver,它将所有异常发送到一个很好呈现的视图。除一种情况外,该方法有效:如果用户请求一个页面,然后发送并“中止”( 我不知道它是如何工作的,但我注意到,如果我单击HTTP发布表单提交按钮的速度非常快,并且通常是Firefox 7以某种方式通知服务器它不再对结果感兴趣。 )然后,Tomcat 6会ClientAbortException在尝试呈现页面或以任何形式写入http响应时引发一个错误。
ClientAbortException
现在开始麻烦了:SimpleMappingExceptionResolver“捕获”异常并尝试将其 很好地 呈现到html页面。然后,这会导致Stream已关闭的异常,从而污染日志文件。(java.lang.IllegalStateException: getOutputStream() has already been called for this response)
SimpleMappingExceptionResolver
java.lang.IllegalStateException: getOutputStream() has already been called for this response
我这样做的目的是为“ ClientAbortException”注册一个空的jsp页面。但是我觉得这是一个hack。另一方面,我想这不是一个不那么普遍的问题,因为我希望几乎在所有呈现所有异常的Spring应用程序中都可以看到它。那么,有人对这个问题有经验吗,或者有一个不太棘手的解决方案的想法?
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" p:defaultErrorView="uncaughtException"> <property name="exceptionMappings"> <props> <prop key=".MissingServletRequestParameterException"> resourceNotFound </prop> <prop key=".ClientAbortException">nothing</prop> </props> </property> </bean>
扩展SimpleMappingExceptionResolver,覆盖doResolveException()方法,并在异常名称为ClientAbortException且response.isCommitted()返回null而不是return的情况下super.doResolveException()。
doResolveException()
response.isCommitted()
null
super.doResolveException()