Возможно ли управлять ошибкой глобально при весенней загрузке?

#java #spring #rest #logging #error-handling

Вопрос:

Мне нужно поймать ошибку (не исключение) во всех контроллерах Rest моего приложения Spring Boot для ведения журнала. Я бы не хотел добавлять блок try.. catch ко всем методам и управлять этими типами метаемых объектов, как я делал с исключением, использующим аннотацию @ExceptionHandler.

 @ControllerAdvice @Component @Order(value = Ordered.HIGHEST_PRECEDENCE) public class CoreExceptionHandler {   @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler  public void handleException(Exception ex) {  //log exception  } }  

Возможно ли это? Каков наилучший способ?

Комментарии:

1. Не совсем уверен. Хотя Error это тоже Throwable просто так Exception , может @ExceptionHandler быть, работает только для Exceptions . Я бы сказал, чтобы попробовать, но, глядя на @ExceptionHandler документацию, в ней четко указано «Аргумент исключения: объявлен как общее исключение или как более конкретное исключение». Так что, я думаю, это не сработает.

2. Я уверен, что это не работает из-за ошибки, тогда я ищу альтернативу…

3. Удалите @Component аннотацию. Кроме того, лучше всего иметь отдельные методы для обработки различного рода исключений.

Ответ №1:

Я нашел это решение, и оно, похоже, работает:

 @ControllerAdvice @Order(value = Ordered.HIGHEST_PRECEDENCE) public class CoreExceptionHandler {   @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler  public void handleThrowable(Throwable tr, HttpServletRequest httpServletRequest) {  if(tr.getCause() instanceof Error) {  //log Error  }  if(tr.getCause() instanceof Exception) {  //log Exception  }  } }