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