如何从SimpleMappingExceptionResolver中排除ClientAbortException

Ral*_*lph 13 java spring tomcat exception-handling

我正在使用SimpleMappingExceptionResolver,它将所有异常发送到一个很好地呈现它的视图.除了一种情况之外,这是有效的:如果用户请求一个页面,然后发送并"中止"(不确切知道它是如何工作的,但我注意到如果我非常快速地点击HTTP帖子表单提交按钮而且经常是Firefox 7以某种方式通知服务器它不再对结果感兴趣.)然后ClientAbortException当一个人尝试渲染页面时,Tomcat 6会上升,或者写出任何类型的http响应.

现在开始麻烦:SimpleMappingExceptionResolver"捕获"异常并尝试将其很好地呈现给html页面.这会导致Stream已经关闭的异常,这会污染日志文件.(java.lang.IllegalStateException: getOutputStream() has already been called for this response)

我所做的就是为"ClientAbortException"注册一个空的jsp页面.但我觉得这是一个哈克.另一方面,我想这不是一个非常不常见的问题,因为我会期望它几乎在每个春季应用程序中呈现所有异常.那么有没有人有这个问题的经验,或者有一个不那么hacky解决方案的想法?

<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>
Run Code Online (Sandbox Code Playgroud)

jos*_*fin 10

扩展SimpleMappingExceptionResolver,覆盖doResolveException()方法,如果异常名称是ClientAbortExceptionresponse.isCommitted()返回null而不是返回super.doResolveException().