Spring Boot - @ControllerAdvice: глобальный ExceptionHandler не работает - PullRequest
1 голос
/ 02 апреля 2020

Ситуация

Я реализовал глобальный обработчик исключений, а именно CustomResponseEntityExceptionHandler.java следующим образом:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(Exception.class)
    public final ResponseEntity<ExceptionResponse> handleAllExceptions(Exception ex, WebRequest request) {
        return new ResponseEntity<>(new ExceptionResponse(ex.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(EntityNotFoundException.class)
    public final ResponseEntity<ExceptionResponse> handleEntityNotFoundException(Exception ex, WebRequest request) {
        return new ResponseEntity<>(new ExceptionResponse(ex.getMessage()), HttpStatus.NOT_FOUND);
    }
}

Как видите, есть два метода обработчика:

  • Один для любого исключения (Exception.class)
  • Один для моего пользовательского определенного ExceptionResponse.java класса

В моем @RestController классе я жестко закодировал throw new EntityNotFoundException():

@RestController
@RequestMapping("/admin/challenge")
public class AdminChallengeController {
@GetMapping("/{id}")
    public Challenge findById(@PathVariable Long id) {
        throw new EntityNotFoundException("hardcoded message");
}

// other class members

Проблема

При отправке запроса в "/ admin / challenge / 1" @ControllerAdvice никогда не выполняется. Я проверил это, вставив жестко закодированное сообщение в класс @ControllerAdvice (НЕ сам Контроллер, как указано выше), и после этого в ответ возвращается сообщение от Контроллера, а НЕ строка @ControllerAdvice. Кроме того, хотя я получаю ошибку 404, я все равно получаю ошибку 500.

Кто-нибудь может мне помочь?

Обновление

В ответ на принятый пост, проблема заключалась в отсутствии методов получения и установки соответствующих полей внутри класса ExceptionResponse.java.

1 Ответ

0 голосов
/ 02 апреля 2020

Ваш код выглядит нормально. В таких случаях отладка действительно поможет. Вы можете попытаться установить точку останова для следующей части:

return new ResponseEntity<>(new ExceptionResponse(ex.getMessage()), HttpStatus.NOT_FOUND);

Вы увидите, что EntityNotFoundException действительно пойман там. Возможно, проблема в том, что вы создали пользовательский ExceptionResponse, который Spring не знает, как его преобразовать. Вы создавали геттеры и сеттеры в классе ExceptionResponse? например,

// or just use the annotations below if you use lombok
// @AllArgsConstructor
// @Data
public class ExceptionResponse {
    String message;

    public ExceptionResponse(String message) { ... }

    public String getMessage() { ... }

    public void setMessage(String message) { ... }
}

Я бы также рекомендовал использовать gson в качестве предпочтительного json mapper для преобразования HTTP-сообщений, если вы не используете Джексона или не внедрили собственный модуль записи тела:

application.properties:

spring.http.converters.preferred-json-mapper=gson

или с использованием application.yml:

spring:
    # other settings ...
    http:
        converters:
            preferred-json-mapper: gson

Ссылки:

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