Как поймать исключение в Spring boot rest api

У меня есть restcontroller со следующим кодом

@RequestMapping(method = RequestMethod.POST, value = "/student")
public void addTopic(@RequestBody Student student) {
    student.setPassword(bCryptPasswordEncoder.encode(student.getPassword()));
    studentService.addStudent(student);
}

но если данные json не соответствуют объекту Student или имеют неправильный формат, создается исключение com.fasterxml.jackson.core.JsonParseException: Unexpected character ('"' (code 34)).

как лучше всего предотвратить это

«как лучше всего предотвратить это» Отправить правильный формат JSON.

takendarkk 23.03.2018 15:00

да, для моего веб-приложения это правда, но как насчет людей, использующих другие инструменты и отправляющих неправильные данные. Я хочу проверить данные и отправить и отправить ответ, если он неправильно отформатирован json

babastyle 23.03.2018 15:05

Возможный дубликат Обработка исключений службы Spring Boot REST

statut 23.03.2018 15:06
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
3
1 007
3

Ответы 3

Для этого используйте Spring ExceptionHandler

Вы можете указать ExceptionHandler на основе типов исключений, а также применить коды ошибок, которые вы хотите использовать.

@ExceptionHandler(JsonParseException.class)
public JacksonExceptionHandler {
  public ResponseEntity<String> handleError(final Exception exception) {
    HttpStatus status = HttpStatus.BAD_REQUEST;
    if (exception != null) {
        LOGGER.warn("Responding with status code {} and exception message {}", status, exception.getMessage());
        return new ResponseEntity<>(exception.getMessage(), status);
    }
}

Кроме того, вы можете использовать javax.validation для проверки полученного объекта, а затем Spring Boot автоматически выполнит всю проверку. Просто добавьте в тело @Valid.

Я обнаружил, что мне нужно поймать JsonProcessingException (от которого идет JsonParseException) в @ExceptionHandler, а не в JsonParseException.

@ControllerAdvice
public class FeatureToggleControllerAdvice {

    @ExceptionHandler(JsonProcessingException.class)
    public ResponseEntity<JSONAPIDocument> handleJsonParseException(JsonProcessingException ex) {
        final Error error = new Error();
        error.setId(UUID.randomUUID().toString());
        error.setStatus(HttpStatus.BAD_REQUEST.toString());
        error.setTitle(ex.getMessage());

        return new ResponseEntity<>(JSONAPIDocument
                .createErrorDocument(Collections.singleton(error)), HttpStatus.NOT_FOUND);
    }

}

Используя JsonParseException в приведенном выше примере, ничего не обнаружено, но использование JsonProcessingException работает должным образом.

Другие вопросы по теме