У меня есть контроллер с почтовым запросом. Я пытаюсь проверить 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?




Я обнаружил, что проблема в том, что у ResponseEntityExceptionHandler уже есть метод для обработки BindExceptions. Это означает, что вы не можете «переопределить» обработку исключений для этого. Это также касается многих исключений (см. класс ResponseEntityExceptionHandler:106). Поэтому, если вы хотите создать свой собственный обработчик Bind Exception, вам нужно переопределить метод, который его обрабатывает, в суперклассе. Это выглядит так:
@Override
protected ResponseEntity<Object> handleBindException(BindException ex, HttpHeaders headers,
HttpStatus status, WebRequest request) {
return handleExceptionInternal(...);
}
С его помощью вы можете вернуть все, что вам нужно. Поэтому я нашел только это решение, если кто-нибудь знает другое, пожалуйста, не стесняйтесь писать здесь :)