simpleMappingExceptionResolver

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的视图解析器,而必须自己处理渲染。

不过要提醒一句-当您在视图层中获取异常时,并非总是能够优雅地处理它们,因为在引发异常时服务器可能已开始将视图输出刷新到客户端,在这种情况下,服务器然后无法呈现单独的错误页面。这就是为什么最好在控制器层中执行尽可能多的逻辑,以便尽早捕获异常的原因。

10-08 13:06