Spring SimpleMappingExceptionResolver不会进入默认视图

时间:2010-06-03 14:46:30

标签: spring spring-mvc

我正在使用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能否应对500种风格错误?

1 个答案:

答案 0 :(得分:9)

正如您所发现的,SimpleMappingExceptionResolver不适用于视图层中抛出的异常。它实现了接口HandlerExceptionResolver,顾名思义,它只处理由处理程序(即控制器)抛出的异常。

如果需要处理视图抛出的异常,可以编写HandlerInterceptor,覆盖afterCompletion()方法,也可以编写非Spring servlet Filter。在这两种情况下,你都不会从Spring的视图解析器中获益,你必须自己处理渲染。

但有一个警告 - 当你在视图层中获得异常时,并不总是能够优雅地处理它们,因为当抛出异常时服务器可能已经开始将视图输出刷新到客户端,其中例如,服务器无法呈现单独的错误页面。这就是为什么在控制器层中尽可能多地执行逻辑的好习惯,以便尽早捕获异常。