Spring SimpleMappingExceptionResolver不会进入默认视图
问题内容:
我正在与SimpleMappingExceptionResolver一起玩,以查看其工作方式,并查看它是否对我们的客户有用,但是我在理解它时遇到了问题。
我尝试过的是访问应用程序中的特定页面,并使其在handleRequestInternal方法中引发异常。
当我抛出RecoverableDataAccessException(DataAccessException的子类)时,按预期显示正确的错误页面。
当我抛出freemarker.core.InvalidReferenceException或java.lang.NumberFormatException时,异常冒泡到页面,并显示默认的500错误页面(即,没有样式)。
下面是我正在使用的映射。
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.springframework.dao.DataAccessException">/general/error/500</prop>
<prop key="freemarker.core.InvalidReferenceException">/general/error/500</prop>
<prop key="NumberFormatException">/general/error/500</prop>
</props>
</property>
<property name="defaultErrorView" value="/general/error/500" />
</bean>
我至少希望默认的错误视图能够捕获异常并显示我的特定错误页面,但这并没有发生。
我在这里正确使用SimpleMappingExceptionHandler吗?
[编辑]我在用码头。
[edit]我意识到SMER不能处理渲染过程中引发的错误,这解释了为什么SMER无法捕获我特别遇到的错误。SMER是否可以应对500个样式错误?
问题答案:
如您所知,它SimpleMappingExceptionResolver
不适用于视图层中引发的异常。它实现了接口HandlerExceptionResolver
,顾名思义,该接口仅处理由处理程序(即控制器)引发的异常。
如果您需要处理视图引发的异常,则可以编写一个HandlerInterceptor
,重写该afterCompletion()
方法,或者编写一个非Spring
servlet Filter
。在这两种情况下,您都无法利用Spring的视图解析器,而必须自己处理渲染。
但是要提醒一句-
当您在视图层中获取异常时,并非总是能够优雅地处理它们,因为在引发异常时服务器可能已开始将视图输出刷新到客户端,在这种情况下,服务器然后无法呈现单独的错误页面。这就是为什么最好在控制器层中执行尽可能多的逻辑,以便尽早捕获异常的原因。