考虑以下代码:
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@Resource
private MessageSource messageSource;
private HttpHeaders headers(){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
private ResponseError responseError(String message,HttpStatus statusCode){
ResponseError responseError = new ResponseError();
responseError.setStatus("error");
responseError.setError(message);
responseError.setStatusCode(statusCode.value());
return responseError;
}
@ExceptionHandler(Exception.class)
private ResponseEntity<Object> handleGeneral(Exception e, WebRequest request) {
if (e.getClass().isAssignableFrom(UndeclaredThrowableException.class)) {
UndeclaredThrowableException exception = (UndeclaredThrowableException) e;
return handleBusinessException((BusinessException) exception.getUndeclaredThrowable(), request);
} else {
String message = messageSource.getMessage("error.server", new Object[]{e.getMessage()}, null);
ResponseError error = responseError(message,HttpStatus.INTERNAL_SERVER_ERROR);
return handleExceptionInternal(e, error, headers(), HttpStatus.INTERNAL_SERVER_ERROR, request);
}
}
@ExceptionHandler({BusinessException.class})
private ResponseEntity<Object> handleBusinessException(BusinessException e, WebRequest request) {
ResponseError error = responseError(e.getMessage(),HttpStatus.CONFLICT);
return handleExceptionInternal(e, error, headers(), HttpStatus.CONFLICT, request);
}
}
更换最大的区别是什么
if (e.getClass().isAssignableFrom(UndeclaredThrowableException.class)) {
与
if (e instanceof UndeclaredThrowableException) {
19号线。
我找到了一些解释,但不够详细。我想了解应该使用 isAssignableFrom 或 instanceof 的情况。
e.getClass().isAssignableFrom(Whatever.class)
测试
e
的运行时类是否是Whatever
的超类,
e instanceof Whatever
测试
e
的运行时类是否是 Whatever
的 子类。
在您的代码中,后者更有意义,但在现代 Java 中,有一种更短、更清晰的编写方式:
if (e instanceof Whatever w) {
// w is now a variable of type Whatever
}