Spring中的Wrapped Exception / getCause()的@ExceptionHandler

时间:2018-05-25 14:16:10

标签: java spring spring-boot

是否有人知道使用@ExceptionHandler进行包装异常的最佳/最简单方法?

我有一个用于转换org.springframework.core.convert.converter.Converter的自定义@PathVariable,如果输入超出标准范围,它会抛出自定义运行时异常。

这最终被Spring ConversionException包裹起来,我可以在我的Controller建议中使用@ExceptionHandler(ConversionException.class)处理。

但是我必须.getCause()并使用instanceof来确定基础异常是否是我感兴趣的类型。此时我可以使用对.sendError()的响应但是如果我有不同的潜在例外,我不知道该怎么办?

如果我重新抛出原始异常,我会收到一条令人讨厌的日志消息'无法调用@ExceptionHandler方法',它感觉不对。

是否有一种简单的方法可以执行@ExceptionHandler(MyCustomConversionException.class),其中MyCustomConversionExceptionConversionException@ControllerAdvice的原因?

谢谢!

1 个答案:

答案 0 :(得分:0)

创建一个ControllerAdvice类@ControllerAdvice,允许您创建多个@ExceptionHandler条目。每种方法都可以引用单个异常或多个异常。

例如:

@ControllerAdvice
public class ExceptionController extends ResponseExceptionHanlder {
  @ExceptionHandler(value = { NumberFormatException.class })
  protected ResponseEntity<Object> handleNumberFormatExcpetion(Exception ex, WebRequest request) {
     //TODO: Handle exception
     return handleExceptionInternal(ex, 'error', new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
  }

  @ExceptionHandler(value = { InvalidClassException.class })
  protected ResponseEntity<Object> handleNumberFormatExcpetion(Exception ex, WebRequest request) {
     //TODO: Handle exception
     return handleExceptionInternal(ex, 'error', new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
  }

  @ExceptionHandler(value = { MaxUploadSizeExceededException.class,  SizeLimitExceededException.class })
  protected ResponseEntity<Object> handleNumberFormatExcpetion(Exception ex, WebRequest request) {
     //TODO: Handle exception
     return handleExceptionInternal(ex, 'error', new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
  }

}