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

#java #spring #spring-boot #spring-mvc #exception

#java #spring #spring-boot #spring-mvc #исключение

Вопрос:

У меня есть контроллер с запросом post. Я пытаюсь проверить 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, но когда я создаю обработчик исключений для класса BindException, приложение spring не запускается. Если я закомментирую метод handleBindException, приложение запустится, и если возникнет исключение BindException, оно просто вернет значение 400 и выйдите из системы с ошибкой, но ничего не отправляется обратно в виде тела ответа.

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

Ответ №1:

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

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

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