1 回答
![?](http://img1.sycdn.imooc.com/5458463b0001358f02200220-100-100.jpg)
TA贡献2003条经验 获得超2个赞
在updateUser调用控制器之前,必须先解析其参数。这是HandlerMethodArgumentResolverComposite进入的地方,并委托给一个预注册的HandlerMethodArgumentResolvers-在这种情况下,它委托给RequestResponseBodyMethodProcessor。
通过委派,我的意思是调用解析器的resolveArgument方法。此方法deserialize从反序列化器中间接调用该方法,该方法引发type异常MyOwnWrittenException。问题在于此异常被包装在另一个异常中。实际上,当它传播回时resolveArgument,它就是type HttpMessageNotReadableException。
因此,MyOwnWrittenException您需要捕获type的异常,而不是捕获自定义异常处理程序HttpMessageNotReadableException。然后,在处理这种情况的方法中,您可以检查是否MyOwnWrittenException确实存在“原始”异常-您可以通过重复调用该getCause方法来做到这一点。就我而言(可能与您的情况相同),我需要调用getCause两次以“解包”原始异常(HttpMessageNotReadableException-> JsonMappingException-> MyOwnWrittenException)。
请注意,您不能在异常处理程序中简单地用替换MyOwnWrittenException,HttpMessageNotReadableException因为它在运行时与专门设计用于处理后一种类型的异常(称为)的另一种方法发生冲突(在运行时)handleHttpMessageNotReadable。
总之,您可以执行以下操作:
@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
// ex.getCause().getCause().getClass() gives MyOwnWrittenException
// the actual logic that handles the exception...
}
}
添加回答
举报