Обработка пользовательских проверок и исключений в REST с помощью SpringBoot - PullRequest
1 голос
/ 10 июля 2019

Пример проекта, прикрепленного здесь

Я следую этой статье Обработка ошибок API (также, пожалуйста, предложите, если есть лучший способ сделать это) для обработки исключенийи проверки в общем виде в моей весенней загрузке службы отдыха.(Я новичок в весне и отдыхе, поэтому я рассматриваю различные статьи для моего требования)

Основная идея о требовании:

(Необходимо проверить запрос POST и отправить ошибки проверкиклиенту структурным способом. Может быть несколько ошибок проверки)

Всякий раз, когда я получаю запрос POST от моего клиента, мне нужно проверить RequestBody.Поэтому я добавил @Valid к параметру и @NotNull к свойствам, которые я хочу проверить.После получения запроса POST пружина проверяет запрос и выдает MethodArgumentNotValidException, что хорошо, так как у меня пропущено обязательное поле.Я занимаюсь этим в общем месте с @ControllerAdvice.После нажатия соответствующего метода handleMethodArgumentNotValid(...) я создаю свой собственный ответ об ошибке APICustomError, который следует из вышеупомянутой статьи.

Когда у меня есть несколько ошибок проверки, я могу зациклить все ошибки и добавить егов список и создание ResponseEntity с моей пользовательской ошибкой.Но возвращенный ResponseEntity не имеет моих добавленных ошибок проверки.

Я понял статью и реализовал то же самое в моем проекте, но действительно не получил то, что мне не хватает.

Нижеэто результат, указанный в статье, и то, что я ожидаю, это:

{
   "apierror":{
      "status":"BAD_REQUEST",
      "timestamp":"10-07-2019 12:53:24",
      "message":"Validation error",
      "subErrors":[
         {
            "object":"person",
            "field":"id",
            "rejectedValue":null,
            "message":"ID cannot be null"
         },
         {
            "object":"person",
            "field":"name",
            "rejectedValue":null,
            "message":"name cannot be null"
         }
      ]
   }
}

, но ниже это то, что я получаю.Я не вижу часть subErrors.

{"message":"Validation Error","debugMessage":null,"detail":null,"httpStatus":"BAD_REQUEST","timestamp":"2019-07-10T17:08:00.52"}

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Вам нужно добавить геттер и сеттеры в APICustomError для правильной сериализации вашего объекта.Также вам нужен открытый конструктор и метод получения / установки для внутреннего класса APIValidationError.Я предлагаю вам использовать Lombok.

После этого вы увидите ошибки, что-то вроде этого ...

{
   "message": "Validation Error",
   "debugMessage": null,
   "subErrors": [
       {
           "object": "personDTO",
           "field": "id",
           "rejectedValue": null,
           "validationErrorMessage": "ID cannot be null."
       }
   ],
   "detail": null,
   "httpStatus": "BAD_REQUEST",
   "timestamp": "2019-07-10T10:25:44.1705441"
}
0 голосов
/ 11 июля 2019

Попробуйте это В вашем совете контроллера

protected ResponseEntity<Object> handleMethodArgumentNotValid(
                MethodArgumentNotValidException ex,
                HttpHeaders headers, 
                HttpStatus status, WebRequest request) {
    Response response = new Response();
    List<FieldError> errors = ex.getBindingResult().getFieldErrors();
    List<SubError> errors = new ArrayList<>();

    for (FieldError e : errors) {
        SubError error = new SubError():
        error.setMessage(String.format(MESSAGE_FORMAT, egetCOde));
        errors.add(error);
    }
    response.setSubError(errors);
    return new ResponseEntity(response, HttpStatus.BAD_REQUEST);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...