Обработка исключений Spring с использованием HttpServletResponse против ResponseEntity

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

#java #spring #весенняя загрузка #spring-mvc

Вопрос:

Я попробовал 2 разных способа реализации обработчика исключений для MethodArgumentNotValidException :

Первый с использованием ResponseEntity :

 @RestControllerAdvice
public class GlobalExceptionHandler
{
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Object> handleException(MethodArgumentNotValidException e, HttpServletResponse response)
        throws IOException
    {
        StringBuilder builder = new StringBuilder();

        Set<String> errors = new HashSet<>();
        for (FieldError error : e.getBindingResult().getFieldErrors())
        {
            builder.append(error.getField()).append(" has invalid value ").append(error.getRejectedValue()).append("; ");
        }

        errors.add(builder.toString());

        return new ResponseEntity<>(errors, org.springframework.http.HttpStatus.BAD_REQUEST) ;
    }
}
  

Второй отправляет ответ напрямую, используя HttpServletResponse :

 @RestControllerAdvice
public class GlobalExceptionHandler
{
    
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public void handleException(MethodArgumentNotValidException e, HttpServletResponse response)
        throws IOException
    {
        StringBuilder builder = new StringBuilder();

        for (FieldError error : e.getBindingResult().getFieldErrors())
        {
            builder.append(error.getField()).append(" has invalid value ").append(error.getRejectedValue()).append("; ");
        }

        response.sendError(HttpStatus.SC_BAD_REQUEST, builder.toString());
    }
}

  

Первый работает должным образом (возвращая правильное тело), но второй возвращает сообщение spring по умолчанию («Ошибка проверки объекта … и т. Д.») В теле.

В чем разница между этими методами и чем объясняется это несоответствие?

Комментарии:

1. Что говорит javadoc о sendError том, как он обрабатывает тело ответа?

2. ResponseEntity указывает Spring на сериализацию и возврат ответа в виде JSON. HttpServletResponse.sendError не будет выполнять преобразование JSON и обновление заголовка.