#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 } } }