ResponseEntityExceptionHandler в SpringBoot 2.0.4.RELEASE - PullRequest
0 голосов
/ 31 августа 2018

У меня есть базовое приложение SpringBoot 2.0.4.RELEASE. Использование Spring Initializer, JPA, встроенного Tomcat, механизма шаблонов Thymeleaf и пакета в качестве исполняемого файла JAR.

Я создал этот класс для управления исключениями

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    public RestResponseEntityExceptionHandler() {
        super();
    }

    // API

    // 400
...
}

Но когда я пытаюсь использовать его в одном из моих методов:

@GetMapping(path = "/getUsers", consumes = "application/json", produces = "application/json")
@ExceptionHandler({RestResponseEntityExceptionHandler.class })
public ResponseEntity<List<User>> testErrors(HttpServletRequest request, @RequestHeader(value = "Authorization") String authHeader) {

...

}

Я получил эту ошибку компиляции:

Несоответствие типов: невозможно преобразовать из класса в класс>

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Если вы прочитаете документы для @ExceptionHandler, вы увидите, что он используется для маркировки метода для обработки исключений. Следовательно, вы должны указать, какие исключения могут обрабатываться (например, @ExceptionHandler(MyException.class) или @ExceptionHandler({MyException.class, MyOtherException.class})). Когда такое исключение происходит в вашем контроллере, этот метод вызывается.

@ControllerAdvice делает методы, определенные в классе, доступными для всех ваших контроллеров.

Я не знаю, что вы хотите сделать, но поскольку вы расширяете ResponseEntityExceptionHandler в классе @ControllerAdvice, вы можете просто удалить @ExceptionHandler annotation:

@GetMapping(...)
public ResponseEntity<List<User>> testErrors(...) {
    ...
}

Если вы хотите обрабатывать определенные исключения самостоятельно, вы можете сделать это следующим образом:

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(MyException.class)
    public ResponseEntity<?> handleMyException() {
        ...
    }

}

@Controller
public class MyController {

    @GetMapping(...)
    public ResponseEntity<List<User>> testErrors(...) {
        throw new MyException();
    }

}

Теперь handleException() будет вызываться при возникновении ошибки в testErrors().

Если вы хотите обрабатывать исключения только в одном контроллере, вы можете сделать это:

@Controller
public class MyController {

    @GetMapping(...)
    public ResponseEntity<List<User>> testErrors(...) {
        throw new MyException();
    }

    @ExceptionHandler(MyException.class)
    public ResponseEntity<?> handleMyException() {
        ...
    }

}
0 голосов
/ 31 августа 2018

Ожидается, что это не будет работать правильно.

Вы пытаетесь передать RestResponseEntityExceptionHandler в качестве аргументов аннотации @ExceptionHandler в вашем методе тестирования. Это неправильно, так как эта аннотация принимает тип исключения, которое перехватывается.

Также в целом кажется, что размещение вашей аннотации @ExceptionHandler кажется неправильным. Они помещаются в метод, который находится в фактическом классе обработки исключений.

Я предлагаю вам хорошо прочитать, как Spring обрабатывает исключения таким образом.

Взгляните на эту часть документации: Обработка исключений в Spring .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...