Как сопоставить ошибку проверки ввода с указанным кодом ошибки c в Spring - PullRequest
0 голосов
/ 04 марта 2020

У меня есть случай, в котором я хотел бы выполнить некоторую проверку ввода для @RequestParams конечной точки.

Я знаю о валидаторах и пользовательских валидаторах, и моя текущая стратегия предполагает создание объекта-оболочки вокруг RequestParams, пользовательский валидатор и применяет уровень класса аннотацию, которая запускает пользовательскую проверку.

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

class MyError {
   int code;
   String message;
}

. Способ возврата этого объекта - через обработчик ошибок @ControllerAdvice, который понимает, что исключение ConstraintValidationException должно возвращать мой пользовательский формат полезной нагрузки. Тем не менее, мне нужно вернуть разные коды и сообщения по разным причинам на входной проверки не удалось. Например:

  • Поле не заполнено -> код XXX
  • Поле отформатировано неправильно -> код YYY

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

Есть ли способ предоставить дополнительные данные для исключения, чтобы я мог различить guish из @ControllerAdvice, что случилось и, соответственно, создать свой собственный ответ об ошибке?

Неправильно ли я подхожу к нему?

1 Ответ

0 голосов
/ 05 марта 2020

Вы можете перехватить BindException (https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/BindException.html) с помощью @ExceptionHandler. Содержит подробную информацию обо всех ошибках валидации. Например, с помощью e.getFieldErrors() вы можете получить доступ ко всем ошибкам, связанным с полями.

Например, для поля

@MyConstraint
@Length(min = 3)
private String field;

, которое не прошло проверку, вы получите следующую информацию в исключении:

  • Ошибка поля в объекте data в поле field: отклоненное значение [XY]; коды [Length.data.field, Length.field, Length. java .lang.String, Length].
  • Ошибка поля в объекте data в поле field: отклоненное значение [XY]; коды [MyConstraint.data.field, MyConstraint.field, MyConstraint. java .lang.String, MyConstraint].

Из этого вы можете видеть, что оно нарушило ограничение @Length и пользовательские @MyConstraint ограничение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...