Как добавить валидаторы в Vaadin 8?

в Vaadin 7 была функция addValidator, но в Vaadin 8 она не существует.

Vaadin 7 Пример:

   TextField user = new TextField("User:");
   user.setRequired(true);
   user.setInputPrompt("Your username");
   user.addValidator(new NullValidator("Username can't be empty", false));
   user.setInvalidAllowed(false);

3 ответов


Я нашел ответ здесь: Что Нового

пример:

new Binder<Person>().forField(tf)
    .withValidator(str -> str.length() == 4, "Must be 4 chars")
    .withConverter(new StringToIntegerConverter("Must be Integer"))
    .withValidator(integer -> integer.equals(2017), "Wrong date")
    .bind(Person::getBirthYear, Person::setBirthYear);

enter image description here


на принятый ответ Диего D выглядит правильно. Этот код, похоже, взят из этого очень короткого (3 минуты), но очень полезное видео, опубликованное компанией Vaadin,введите безопасную проверку до и после преобразователей. Показывает новый подход Vaadin 8 к проверке. Я добавлю некоторые заметки, покажу расширенный синтаксис и предоставлю полный пример кода для полного рабочего приложения.

Валидатор + Биндер

одна большая разница в Фреймворк Vaadin 8 заключается в том, что валидаторов требует использование связующего. В старые времена вы прикрепляли валидатор к полю,но теперь в Vaadin 8 вы прикрепляете валидатор только к связующему. Команда Vaadin признает, что для некоторых простых ситуаций это требование связующего может оказаться раздражающим, но по большей части они разумно ожидают, что ситуации, требующие проверки, вполне вероятно, также делают привязку. Очень логичное переосмысление, я полагаю. Обсуждается в другой компании Vaadin видео, вебинар: что нового в Vaadin 8?.

проверка и конвертеры

мы определяем два разных валидатора, один из которых должен быть вызван до того, как конвертер преобразует ввод данных пользователя, а другой - после преобразования. Так что порядок беглого стиля withValidator и withConverter вызовы методов являются ключом к правильному поведению здесь. Конечно!--3--> и afterConversion плохие имена для объектов валидатора, но сделаны так, чтобы прояснить намерение запуска до или после конвертера в этой демонстрации.

Lambda synax необязательно

один валидатор использует обычный стиль кода Java, переопределяющий метод. Другой валидатор использует лямбда-синтаксис. Смотрите видео и смотрите Диего D Ответ для кода, упрощенного с помощью однострочных лямбда-аргументов.

package com.example.valapp;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.data.Binder;
import com.vaadin.data.ValidationResult;
import com.vaadin.data.Validator;
import com.vaadin.data.ValueContext;
import com.vaadin.data.converter.StringToIntegerConverter;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.*;

import javax.servlet.annotation.WebServlet;


/**
 * This UI is the application entry point. A UI may either represent a browser window
 * (or tab) or some part of a html page where a Vaadin application is embedded.
 * <p>
 * The UI is initialized using {@link #init(VaadinRequest)}. This method is intended to be
 * overridden to add component to the user interface and initialize non-component functionality.
 */
@Theme ( "mytheme" )
public class MyUI extends UI {

    @Override
    protected void init ( final VaadinRequest vaadinRequest ) {

        final TextField tf = new TextField ( "Enter year of birth:" );

        Validator<String> beforeConversion = new Validator < String > ( ) {
            @Override
            public ValidationResult apply ( String s, ValueContext valueContext ) {
               if(s.length ()!= 4) {
                   return  ValidationResult.error ( "Year must consist of 4 digits" );
               } else {
                   return  ValidationResult.ok () ;
               }
            }
        } ;

        Validator<Integer> afterConversion = Validator.from ( value -> value.equals ( 2017 ), "Wrong year." );

        new Binder < Person > ( )
                .forField ( tf )
                .withValidator ( beforeConversion )
                .withConverter ( new StringToIntegerConverter ( "Input must be Integer" ) )
                .withValidator ( afterConversion )
                .bind ( Person:: getYearOfBirth, Person:: setYearOfBirth );

        Button button = new Button ( "Tell me" );
        button.addClickListener ( event -> Notification.show("This is the caption", "This is the description", Notification.Type.HUMANIZED_MESSAGE) );

        setContent ( new VerticalLayout ( tf  , button ) );
    }

    @WebServlet ( urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true )
    @VaadinServletConfiguration ( ui = MyUI.class, productionMode = false )
    public static class MyUIServlet extends VaadinServlet {
    }
}

Что делать, если у вас нет связующего из-за создания динамической формы?

Vaadin 8.1 поддерживает удаление связующего для поля, поддерживающего динамические формы. Если вы сделаете поле невидимым, удалите связующее устройство для этого поля. Повторно добавьте связующее, когда вы сделаете поле видимым.