如何在Spring Exception Handler中处理包装的异常?[重复]

我有Spring MVC和杰克逊。当我发出不正确的请求时,杰克逊映射失败并被UnrecognizedPropertyException抛出。我想使用

@ExceptionHandler

public String handle(UnrecognizedPropertyException e) {

...

}

但是Spring封装了这个异常,HttpMessageConversionException因此上面的代码不起作用。Spring是否有可能处理Jackson特定(或一般库特定)的异常?

回答:

不幸的是,UnrecognizedPropertyException是的子类型IOException。在RequestResponseBodyMethodProcessor一个处理@RequestBody(我认为这就是发生异常)具有特殊处理IOException(如解析请求输入流的失败),在其包装HttpMessageNotReadableException。另外,如果在期间发生转换错误,HttpMessageConverter则指定接口抛出。HttpMessageNotReadableExceptionread

无论如何,您都将不得不处理该问题(如果杰克逊抛出了未经检查的异常,情况可能会有所不同)。

幸运的是,从4.3开始,Spring

MVCExceptionHandlerMethodResolver(处理@ExceptionHandler)可以解开cause异常的包装(请参阅SPR-14291)。因此,假设您的处理HttpMessageNotReadableException程序方法的继承层次结构中没有任何异常的处理程序

@ExceptionHandler

public String handle(UnrecognizedPropertyException e) {

...

}

将用于处理异常。在Spring

MVC寻找可以处理的处理程序方法HttpMessageNotReadableException之后,然后使用展开嵌套的异常Throwable#getCause并再次尝试查找,就会发生这种情况。


在4.3之前的版本中,或者如果您在HttpMessageNotReadableException继承层次结构中确实有针对异常类型的处理程序,则始终可以在自己提取出原因之后委托。

@ExceptionHandler

public String handle(HttpMessageConversionException e) throws Throwable {

Throwable cause = e.getCause();

if (cause instanceof UnrecognizedPropertyException) {

handle((UnrecognizedPropertyException) cause);

}

...

}

public String handle(UnrecognizedPropertyException e) {

...

}

以上是 如何在Spring Exception Handler中处理包装的异常?[重复] 的全部内容, 来源链接: utcz.com/qa/408673.html

回到顶部