如何配置Spring 4.0.5使用@ExceptionHandler而不是ExceptionResolver?

时间:2014-08-02 05:51:53

标签: java spring spring-mvc spring-data

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

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

问题是:我还有一个自定义

org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver

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

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

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

1 个答案:

答案 0 :(得分:4)

默认情况下,DispatcherServlet会加载并注册HandlerExceptionResolver中的所有ApplicationContext实施,以帮助您处理Controllers中的例外情况。您会注意到AbstractHandlerExceptionResolver类实现了Ordered。大多数HandlerExceptionResolver实现扩展了此类,DispatcherServlet使用此实现来处理HandlerExceptionResolver实现列表,以处理Controllers抛出的异常。

您可能会怀疑,@ExceptionHandlerControllers注释的处理也由HandlerExceptionResolver实施处理。确切地说:org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver

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

为了抵消这种情况,我们需要做两件事:

  1. AnnotationMethodHandlerExceptionResolver
  2. 中直接将ApplicationContext注册为bean
  3. 将此bean的Order值设置为大于自定义HandlerExceptionResolver实现的值{/ 1}

    这意味着在处理Exceptions的{​​{1}}时,Spring会首先查看Controllers是否可以处理异常,如果没有,则会回退到您的自定义AnnotationMethodHandlerExceptionResolver实施。

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

    HandlerExceptionResolver

    您可能还希望查看默认情况下注册为<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" p:order="1" /> 的{​​{1}}实施列表,并确定最适合您应用的订单。