我在特定控制器上添加了@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?
答案 0 :(得分:4)
默认情况下,DispatcherServlet
会加载并注册HandlerExceptionResolver
中的所有ApplicationContext
实施,以帮助您处理Controllers
中的例外情况。您会注意到AbstractHandlerExceptionResolver
类实现了Ordered
。大多数HandlerExceptionResolver
实现扩展了此类,DispatcherServlet
使用此实现来处理HandlerExceptionResolver
实现列表,以处理Controllers
抛出的异常。
您可能会怀疑,@ExceptionHandler
上Controllers
注释的处理也由HandlerExceptionResolver
实施处理。确切地说:org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver
我建议您的情况是HandlerExceptionResolver
DispatcherServlet
导致您的实现在AnnotationMethodHandlerExceptionResolver
之前被调用,意味着您的@ExceptionHandler
有效地忽略了注释。
为了抵消这种情况,我们需要做两件事:
AnnotationMethodHandlerExceptionResolver
ApplicationContext
注册为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}}实施列表,并确定最适合您应用的订单。