Привязать обработку исключений только к классу @ControllerAdvice - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть класс контроллера с методами REST, которые могут выдавать различные исключения.Я решил обработать эти исключения в отдельном классе, используя @ControllerAdvice и @ExceptionHandler для моих методов-обработчиков.Однако у меня проблема в том, что мои методы REST используют аннотации из другой библиотеки.Эта библиотека ловит исключение, которое выдает и мой метод REST.Теперь, когда я обрабатываю исключения глобально, а не через try / catch в методе REST напрямую, мое исключение всегда перехватывается другой библиотекой, а не моим собственным методом-обработчиком.Видимо, этот другой метод в библиотеке я использую выигрыши из-за аннотации.Как я могу привязать обработку исключений к своему собственному классу, чтобы никто не смог ее перехватить?

Мой метод REST:

@SomeLibraryAnnotation
@PostMapping(path = "/add", consumes = MediaType.APPLICATION_JSON_VALUE)
public HttpEntity< ? > addItem(@RequestHeader HttpHeaders headers, @RequestBody MyDTO myDTO)
  throws UnsupportedOperationException {
  doSomethingWith(myDTO);
  return ResponseEntity.status(HttpStatus.CREATED).build();
}

Мой класс обработчика исключений:

@ControllerAdvice
public class MyExceptionHandler {

 @ExceptionHandler(UnsupportedOperationException.class)
 public ResponseEntity<?> handleUnsupportedOperationException(UnsupportedOperationException e) {        
    return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage());
 }
}

Поскольку метод библиотеки также перехватывает исключение UnsupportedOperationException, он выигрывает из-за @SomeLibraryAnnotation, и исключение никогда не обрабатывается в моем классе обработчика.

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете попробовать использовать @Order или @Priority в классе MyExceptionHandler, как описано в Установка приоритета нескольких @ControllerAdvice @ ExceptionHandlers .

Это даст Springвозможность использовать свой класс вместо того, который указан @SomeLibraryAnnotation.Однако, не зная, как Spring интерпретирует эту другую аннотацию при инициализации контекста, это только предположение.

...