Обработка BindException в приложении SpringBoot с помощью глобального обработчика исключений

У меня есть контроллер с почтовым запросом. Я пытаюсь проверить POJO с помощью простой аннотации NotNull. Я использую ControllerAdvice для обработки исключений.

@PostMapping("/something")
public MyResponse post(@Valid MyRequest request) {
   // nevermind...
}
public class MyRequest {
  @NotNull
  private Integer something;
  // Getters setters nevermind...
}
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(value = BindException.class)
    protected ResponseEntity<Object> handleBindException(RuntimeException ex, WebRequest request) {
        return handleExceptionInternal(...);
    }
}

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

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerExceptionResolver]: Factory method 'handlerExceptionResolver' threw exception; nested exception is java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.validation.BindException]: {protected org.springframework.http.ResponseEntity com.liligo.sponsoredads.controller.RestResponseEntityExceptionHandler.handleBindException(java.lang.Exception,org.springframework.web.context.request.WebRequest), public final org.springframework.http.ResponseEntity org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler.handleException(java.lang.Exception,org.springframework.web.context.request.WebRequest) throws java.lang.Exception}

Поэтому я хотел бы создать свой собственный обработчик для BindExceptions, но когда я создаю ExceptionHandler для класса BindException, приложение Spring не запускается. Если я закомментирую метод handleBindException, приложение запустится, и если возникнет BindException, оно просто вернет 400 и выйдет из журнала ошибки, но ничего не будет отправлено обратно в качестве тела ответа.

Каким может быть решение для создания собственного обработчика BindExceptions?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
2 102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что проблема в том, что у ResponseEntityExceptionHandler уже есть метод для обработки BindExceptions. Это означает, что вы не можете «переопределить» обработку исключений для этого. Это также касается многих исключений (см. класс ResponseEntityExceptionHandler:106). Поэтому, если вы хотите создать свой собственный обработчик Bind Exception, вам нужно переопределить метод, который его обрабатывает, в суперклассе. Это выглядит так:

@Override
    protected ResponseEntity<Object> handleBindException(BindException ex, HttpHeaders headers,
                                                         HttpStatus status, WebRequest request) {
    return handleExceptionInternal(...);
}

С его помощью вы можете вернуть все, что вам нужно. Поэтому я нашел только это решение, если кто-нибудь знает другое, пожалуйста, не стесняйтесь писать здесь :)

Другие вопросы по теме