Spring SimpleMappingExceptionResolver不会进入默认视图

Rac*_*hel 3 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>
Run Code Online (Sandbox Code Playgroud)

我至少期望默认的错误视图来获取异常并显示我的特定错误页面但是没有发生.

我在这里正确使用SimpleMappingExceptionHandler吗?

[编辑]我正在使用码头.

[编辑]我已经意识到SMER不处理渲染过程中抛出的错误,这解释了为什么它无法捕捉到我特别遇到的问题.SMER能否应对500种风格错误?

ska*_*man 9

正如您所发现的那样,SimpleMappingExceptionResolver对视图层中抛出的异常不起作用.它实现了一个接口HandlerExceptionResolver,顾名思义,它只处理由处理程序(即控制器)抛出的异常.

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

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