【问题标题】:How-to configure Spring 4.0.5 to use an @ExceptionHandler instead of an ExceptionResolver?如何配置 Spring 4.0.5 以使用 @ExceptionHandler 而不是 ExceptionResolver?
【发布时间】:2014-08-02 05:51:52
【问题描述】:

我在特定控制器上添加了@ExceptionHandler 方法。

@ExceptionHandler(NullPointerException.class)
@ResponseStatus(HttpStatus.Not_FOUND)
public @ResponseBody doSomeThing(NullPointerException e) {...}

问题是:我也有一个习惯

org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver

在我的 Rest 应用程序(旧版)中定义为 @Component。

现在我的特定控制器中的@ExceptionHandler 永远不会被调用。我需要支持两种异常处理策略。

如何配置 spring 4.0.5 以便我的 Controller 中的 @ExceptionHandler 被调用?

【问题讨论】:

    标签: java spring spring-mvc spring-data


    【解决方案1】:

    默认情况下,DispatcherServlet 将在ApplicationContext 中加载和注册所有HandlerExceptionResolver 实现,以帮助处理来自Controllers 的异常。你会注意到AbstractHandlerExceptionResolver 类实现了Ordered。大多数HandlerExceptionResolver 实现扩展了这个类,DispatcherServlet 在处理Controllers 抛出的异常时使用它来排序HandlerExceptionResolver 实现列表。

    您可能怀疑,Controllers 上的 @ExceptionHandler 注释的处理也由 HandlerExceptionResolver 实现处理。准确地说:org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver

    我建议在您的情况下发生的是DispatcherServlet 的那种HandlerExceptionResolver 导致您的实现在AnnotationMethodHandlerExceptionResolver 之前被调用,这意味着您的@ExceptionHandler 注释被有效地忽略。

    为了解决这个问题,我们需要做两件事:

    1. 直接将AnnotationMethodHandlerExceptionResolver注册为ApplicationContext中的一个bean
    2. 将此 bean 的 Order 值设置为大于您的自定义 HandlerExceptionResolver 实现的值

    这意味着在为您的Controllers 处理Exceptions 时,Spring 将首先查看AnnotationMethodHandlerExceptionResolver 是否可以处理异常,如果不能,则回退到您的自定义HandlerExceptionResolver 实现。

    作为在HandlerExceptionResolver 上设置顺序的示例(假设您在某处使用 XML 配置):

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" p:order="1" />
    

    您可能还想查看默认注册到DispatcherServletHandlerExceptionResolver 实现列表,并确定最适合您的应用程序的顺序。

    【讨论】:

    • 从 spring 3.1 开始请使用 ExceptionHandlerExceptionResolver。
    猜你喜欢
    • 2020-09-11
    • 2014-09-15
    • 2020-02-04
    • 2016-01-03
    • 2013-10-26
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    相关资源
    最近更新 更多