使用Spring 2.5.6,我已经配置了SimpleMappingExceptionResolver
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="MismatchException">error/mismatch-error</prop>
<prop key="Exception">error/${module.render.error.logical.page}</prop>
<prop key="IllegalArgumentException">error/module-illegal-arg</prop>
<prop key="MissingServletRequestParameterException">error/module-illegal-arg</prop>
</props>
</property>
</bean>
我的想法是,对于IllegalArgumentException和MissingServletRequestParameterException,我想要一个稍微不同的错误屏幕,并且还返回了400状态代码。
IllegalArgumentException工作得很好,引用的JSP正确地将状态设置为400.MissingServletRequestParameterException不起作用,而是我得到一个通用的500错误。
答案 0 :(得分:1)
几个小时之后,我认为在web.xml中可能存在错误/ module-illegal-arg.jsp中的错误或者可能需要额外的配置,我跳进调试器并追溯到getDepth()方法SimpleMappingExceptionResolver.java。
基本上,它将Exception条目与MissingServletRequestParameterException匹配。虽然Exception是超级类,但人们会认为这种方法更倾向于直接匹配到几个级别的深度。实际上,这就是getDepth()的全部目的。第366行给出了最后的线索:
if (exceptionClass.getName().indexOf(exceptionMapping) != -1) {
所以基本上,Exception会在深度级别为0的任何类中匹配,其名称中的工作为Exception。
那么为什么IllegalArgumentException工作而MissingServletRequestParameterException没有呢?底层存储是HashTable。 IllegalArgumentException散列为比Exception更早的值。异常冲突到比MissingServletRequestParameterException更早的值。
最后修复:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="MismatchException">error/mismatch-error</prop>
<!--
The full path is here in order to prevent matches on every class with the word
'Exception' in its class name. The resolver will go up the class hierarchy and will
still match all derived classes from Exception.
-->
<prop key="java.lang.Exception">error/${module.render.error.logical.page}</prop>
<prop key="IllegalArgumentException">error/module-illegal-arg</prop>
<prop key="MissingServletRequestParameterException">error/module-illegal-arg</prop>
</props>
</property>
</bean>