Неоднозначный метод @ExceptionHandler для HttpMessageNotReadableException

В моем @RestController я успешно обрабатываю исключения JSONParse, исходящие от @RequestBody (например, строка, неправильно введенная в поле Integer). Это код:

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({ HttpMessageNotReadableException.class })
public ValidationError handleException(HttpMessageNotReadableException ex) {
    if (ex.getCause() instanceof InvalidFormatException) {
        ...
    } else {
        throw ex;
    }
}

Теперь я хочу переместить это в @ControllerAdvice, чтобы его использовали многие контроллеры. Вот:

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler({ HttpMessageNotReadableException.class })
    public ValidationError handleException(HttpMessageNotReadableException ex) {
        if (ex.getCause() instanceof InvalidFormatException) {
            ...
        } else {
            throw ex;
        }
    }

Но Spring жалуется на следующее: Ambiguous @ExceptionHandler method mapped for [class org.springframework.http.converter.HttpMessageNotReadableException]: {public Object foo.bar.RestExceptionHandler.handleException(org.springframework.http.converter.HttpMessageNotReadableException), 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}

Я не могу переопределить ResponseEntityExceptionHandler.handleException, потому что он окончательный. Какие еще есть варианты?

Использование Spring Boot 2.4.3.


person bz3x    schedule 18.04.2021    source источник


Ответы (1)


Я не могу переопределить ResponseEntityExceptionHandler.handleException, потому что он окончательный

Вместо этого вы должны переопределить метод protected ResponseEntity<Object> handleHttpMessageNotReadable(...) для пользовательской обработки ошибок.

person crizzis    schedule 18.04.2021