📜  在 CustomExceptionHandler 中不起作用,因为在 DefaultHandlerExceptionResolver (1)

📅  最后修改于: 2023-12-03 15:23:08.079000             🧑  作者: Mango

在 CustomExceptionHandler 中不起作用的原因

背景介绍

在 Spring 框架中,当发生异常时,系统会根据一定的异常处理顺序去尝试解决这个异常。其中,在默认的异常处理器 DefaultHandlerExceptionResolver 中,会提供一些默认的异常处理方案。而如果你自己定义了一个异常处理器 CustomExceptionHandler,有时你会发现它并没有被调用到,这是为什么呢?

原因解析

在 Spring 的默认异常处理器 DefaultHandlerExceptionResolver 中,会提供一些默认的异常处理方案。这些方案包括:

  • 如果是 BeanValidation 异常,会调用 MethodArgumentNotValidException 处理器;
  • 如果是 HttpMessageNotReadableException 异常,会调用 HttpMessageNotReadableException 处理器;
  • 如果是 HttpMessageNotWritableException 异常,会调用 HttpMessageNotWritableException 处理器;
  • 如果是 MissingPathVariableException 异常,会调用 MissingPathVariableException 处理器;
  • 如果是 MissingServletRequestParameterException 异常,会调用 MissingServletRequestParameterException 处理器;
  • 如果是 NoSuchRequestHandlingMethodException 异常,会调用 NoSuchRequestHandlingMethodException 处理器;
  • 如果是 TypeMismatchException 异常,会调用 TypeMismatchException 处理器;
  • 如果是 BindException 异常,会调用 BindException 处理器。

可以看出,这些异常处理器已经对一些常见的异常做了处理,并且它们的优先级也比较高,因此在这些异常发生时,CustomExceptionHandler 就不会被调用了。

解决方案

要让 CustomExceptionHandler 生效,我们需要在 DefaultHandlerExceptionResolver 中将其优先级调高。可以通过在 Spring 配置文件中添加以下代码来实现:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="com.example.CustomException">customExceptionHandler</prop>
        </props>
    </property>
    <property name="defaultErrorView" value="error" />
    <property name="order" value="10" />
</bean>

其中,order 的值越小,优先级越高,我们将其设为 10,任何情况下都要高于默认异常处理器中的处理方案。

总结

CustomExceptionHandler 中不起作用的原因是因为它的优先级不够高,被默认异常处理器中的处理方案所覆盖。通过在 Spring 配置文件中设置优先级,我们可以避免这种情况的发生,确保 CustomExceptionHandler 能够被正确调用。