Spring Converter, Validator и DataBinder: как обрабатывать многозначные поля бинов по отдельности? - PullRequest
1 голос
/ 27 сентября 2019

У меня есть bean-компонент, имеющий поле типа List среди прочего.

  public List<MyClass> getter() {
    return field;
  }

  public void setter(MyClass[] source) {
    this.field = Arrays.asList(source);
  }

Я реализовал конвертер Converter<String, MyClass>, и он тоже работает.Если строка может быть преобразована в MyClass, она преобразуется, а если нет, генерируется исключение, и экземпляр FieldError включается в Errors errors = binder.getBindingResult();.Проблема в том, что метод FieldError#getRejected a String с разделенным запятыми списком допустимых и недопустимых значений может ввести в заблуждение.И без пробела, что просто безобразно.Например:

Field has invalid value of "valid,invalid"

, а я бы предпочел

Field has invalid value of "invalid"

Другими словами, как заставить преобразование и проверку работать индивидуально для каждого значения?

1 Ответ

1 голос
/ 29 сентября 2019

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

            FieldError fieldError = bindingResult.getFieldError();
            if (fieldError != null && fieldError.contains(TypeMismatchException.class)) {
                TypeMismatchException typeMismatchException = fieldError.unwrap(TypeMismatchException.class);
                ConversionFailedException conversionFailedException = findConversionFailedException(typeMismatchException);
                if (conversionFailedException != null) {
                    Object value = conversionFailedException.getValue();
                    // get the invalid field value
                }
            }
    /**
     * Recursively find the ConversionFailedException
     * @param target
     * @return
     */
    public ConversionFailedException findConversionFailedException(Throwable target) {
        Throwable cause = target.getCause();
        if (cause == null) {
            return null;
        } else if (cause instanceof ConversionFailedException) {
            return (ConversionFailedException)cause;
        }
        return findConversionFailedException(target);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...