Spring异常处理程序不处理某些类型的异常


问题内容

我在spring 2.5应用程序中设置了一个简单的异常处理程序。当前,它捕获所有Exceptions并显示一个stacktrace页面。

这很好,但是现在Spring Security不能正确地将未登录的用户踢到登录页面,而是显示了带有Spring Security异常的异常页面:

org.springframework.security.AccessDeniedException

问题在于此应用程序没有用于所有异常的自己的Exception子类,因此我必须映射Exception但取消映射AccessDeniedException

2.5spring有可能吗?

编辑 :与spring安全2.0.1

我的豆子看起来像这样

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.RuntimeException">common/error</prop>
        </props>
    </property>
</bean>**

问题答案:

我们处理此问题的方法是拥有一个自定义的异常解析器类,该类可处理其他处理程序未捕获的任何异常-
它实现HandlerExceptionResolver,Ordered。

我们声明一个捕获特定异常的单独SimpleMappingExceptionResolver bean。

这样的顺序使得我们的自定义解析程序在SimpleMappingExceptionResolver之后运行。

结果是指定的异常(例如AccessDeniedException)由SimpleMappingExceptionResolver处理并定向到适当的页面。

其他任何运行时异常都由自定义解析器处理,该解析器转发到一般错误页面。

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="org.springframework.security.AccessDeniedException">accessDenied</prop>
            <prop key="org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException">accessDenied</prop>
        </props>
    </property>
    <property name="order" value="0"/>
</bean>

<bean class="package.to.your.handler.DefaultExceptionResolver">
    <property name="order" value="1"/>
</bean>

这种安排使您可以使用Spring解析器捕获尽可能多的异常(我在这里捕获2个AccessDenied和HibernateOptimisticLockingFailureException),而其他所有异常都由自定义解析器捕获。在上面接受的解决方案中,您必须编写更多的Java代码来捕获AccessDenied以外的异常。