我正在使用SimpleMappingExceptionResolver,它将所有异常发送到一个很好呈现的 View 。除一种情况外,该方法有效:
如果用户请求一个页面,然后发送并“中止”(我不知道确切的工作原理,但是我注意到,如果我单击HTTP发布表单提交按钮的速度非常快,并且Firefox 7通常会以某种方式通知服务器,然后,Tomcat 6在尝试呈现页面或以任何形式写入http响应时,会升起 ClientAbortException
。
现在开始麻烦:SimpleMappingExceptionResolver
“捕获”异常并尝试将其很好地呈现到html页面。然后,这将导致Stream已关闭的异常,从而污染日志文件。 (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
而不是super.doResolveException()
。