web-dev-qa-db-fra.com

Comment ajouter des validateurs dans Vaadin 8?

Dans Vaadin 7, il y avait une fonction addValidator, mais dans Vaadin 8, elle n'existe pas.

Vaadin 7 Exemple:

   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);
11
Diego D

J'ai trouvé la réponse ici: Quoi de neuf

Exemple:

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

19
Diego D

--- Réponse acceptée par Diego D semble correcte. Ce code semble être tiré de cette très brève (3 minutes) mais très vidéo utile publiée par la société Vaadin, Tapez la validation sûre avant et après les convertisseurs . Montre la nouvelle approche Vaadin 8 de la validation. Je vais ajouter quelques notes, montrer la syntaxe développée et fournir un exemple complet de code pour une application fonctionnelle complète.

Validateur + classeur

Une grande différence dans Vaadin 8 est que les validateurs nécessitent tilisation d'un liant. Dans le passé, vous avez attaché un validateur à un champ, mais maintenant dans Vaadin 8 vous attachez un validateur uniquement à un classeur. L'équipe Vaadin reconnaît que pour certaines situations simples, cette exigence de liant peut s'avérer ennuyeuse, mais pour la plupart, elle s'attend raisonnablement à ce que les situations nécessitant une validation fassent probablement aussi un lien. Une réflexion très logique, je crois. Discuté dans une autre vidéo d'entreprise Vaadin, Webinaire: Quoi de neuf dans Vaadin 8? .

Validation et convertisseurs

Nous définissons deux validateurs différents, l'un à appeler avant qu'un convertisseur ne convertisse la saisie de données de l'utilisateur et l'autre à appeler après la conversion. Ainsi, l'ordre des appels de méthode withValidator et withConverter de style fluide est essentiel pour corriger le comportement ici. Bien sûr, beforeConversion et afterConversion sont de mauvais noms pour les objets de validation, mais ils le sont pour clarifier l'intention d'exécuter avant ou après le convertisseur dans cette démo.

Lambda synax en option

Un validateur utilise conventionnel Java écrase une méthode. L'autre validateur utilise la syntaxe Lambda. Regardez la vidéo et voyez la réponse de Diego D pour le code encore plus simple avec single- arguments Lambda.

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 {
    }
}
4
Basil Bourque

Que faire si vous n'avez pas de classeur en raison de la création d'un formulaire dynamique?

Vaadin 8.1 prend en charge la suppression du classeur pour un champ qui prend en charge les formulaires dynamiques. Si vous rendez un champ invisible, retirez le classeur de ce champ. Ajoutez à nouveau le classeur lorsque vous rendez le champ visible.

1
Brett Sutton