#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 и обновление заголовка.