#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(...);
}
С его помощью вы можете возвращать все, что вам нужно. Итак, я нашел только это решение, если кто-нибудь знает какое-либо другое, пожалуйста, не стесняйтесь писать здесь 🙂