NoSuchElementException @ExceptionHandler в SpringBoot не работает - PullRequest
0 голосов
/ 28 января 2020

Я создал собственный обработчик исключений в SpringBoot

@RestControllerAdvice
public class DataApiExceptionHandler extends ResponseEntityExceptionHandler {
 @ExceptionHandler(NoSuchElementException.class)
        public final void **handleNoSuchElementException**(NoSuchElementException ex) {
            System.err.println("This is throwing :"+ex.getMessage());
        }
...
@ExceptionHandler({ Exception.class })
    public ResponseEntity<Object> **handleAll**(final Exception ex) {
...

и выбрасывал исключение как

throw new NoSuchElementException("SomelogicalDescription");

, но каждый раз, когда я выкидываю это исключение NoSuchElementException, handleAll выполняется вместо handleNoSuchElementException.

Я мог бы упустить что-то очень тривиальное. Помогите мне в этом разобраться.

***To change NoSuchElementException with NotFoundException does not make any difference.***

1 Ответ

0 голосов
/ 28 января 2020

Похоже, вы не понимаете активность @RestControllerAdvice.

ПРИМЕЧАНИЕ. @RestControllerAdvice обрабатывается, если настроена соответствующая пара HandlerMapping-HandlerAdapter, например пара RequestMappingHandlerMapping-RequestMappingHandlerAdapter, которая по умолчанию в конфигурации MVC Java и в пространстве имен MVC. RestControllerAdvice

Используйте взамен @ControllerAdvice. ControllerAdvice

У вас есть обработчик void - почему тогда вы ожидаете ответа?

Что вы там перенастроили? Это может быть так:

@ControllerAdvice
public class InvalidValuesExceptionHandler extends ResponseEntityExceptionHandler {

  @ExceptionHandler({ InvalidValuesException.class })
  protected ResponseEntity<Object> handleInvalidRequest(RuntimeException exc, WebRequest request) {
    InvalidValuesException ive = (InvalidValuesException) exc;

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

    BasicResultMessage msg = new BasicResultMessage(ive.getDataId(),
                                                    ive.getMessage());
    SendDataResult result = new SendDataResult(false, msg);

    return handleExceptionInternal(exc, result, headers, HttpStatus.BAD_REQUEST, request);
  }
}
...