Как обработать ошибку десериализации Джексона для всех видов несоответствия данных при весенней загрузке - PullRequest
0 голосов
/ 06 сентября 2018

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

Это код:

@PutMapping
public ResponseEntity updateLimitations(@PathVariable("userId") String userId,
                                        @RequestBody LimitationParams params) {
  Limitations limitations = user.getLimitations();
  params.getDatasets().forEach(limitations::updateDatasetLimitation);
  params.getResources().forEach(limitations::updateResourceLimitation);
  userRepository.save(user);
  return ResponseEntity.noContent().build();
}

И тело запроса, которое я ожидал, выглядит так:

{
  "datasets": {"public": 10},
  "resources": {"cpu": 2}
}

Но когда они отправляют что-то вроде этого:

{
  "datasets": {"public": "str"}, // <--- a string is given
  "resources": {"cpu": 2}
}

Ответ покажет что-то подобное в журналах:

400 JSON parse error: Cannot deserialize value of type `java.lang.Integer` from String "invalid": not a valid Integer value; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.lang.Integer` from String "invalid": not a valid Integer value

at [Source: (PushbackInputStream); строка: 1, столбец: 23] (через цепочку ссылок: com.openbayes.api.users.LimitationParams ["наборы данных"] -> java.util.LinkedHashMap ["public"])

Но то, что я хочу, - это более удобочитаемое сообщение.

Я пытался использовать ExceptionHandler для com.fasterxml.jackson.databind.exc.InvalidFormatException, но это не работает.

1 Ответ

0 голосов
/ 06 сентября 2018

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

Вот пример совета контроллера при весенней загрузке:

@RestControllerAdvice
public class ControllerAdvice {
    @ExceptionHandler(InvalidFormatException.class)
    public ResponseEntity<ErrorResponse> invalidFormatException(final InvalidFormatException e) {
        return error(e, HttpStatus.BAD_REQUEST);
    }

    private ResponseEntity <ErrorResponse> error(final Exception exception, final HttpStatus httpStatus) {
        final String message = Optional.ofNullable(exception.getMessage()).orElse(exception.getClass().getSimpleName());
        return new ResponseEntity(new ErrorResponse(message), httpStatus);
    }
}

@AllArgsConstructor
@NoArgsConstructor
@Data
public class ErrorResponse {
    private String errorMessage;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...