web-dev-qa-db-ja.com

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

私はここで答えを見つけました: Whats New

例:

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

Diego Dによる承認済みの回答 は正しいように見えます。そのコードは、この非常に短い(3分)から取られたようですが、very Vaadin社によって公開された役立つビデオ コンバーターの前後のタイプセーフ検証 です。検証に対するVaadin 8の新しいアプローチを示します。メモをいくつか追加し、拡張された構文を示し、完全に機能するアプリの完全なサンプルコードを提供します。

バリデータ+バインダー

Vaadin 8の大きな違いの1つは、バリデーターには バインダーの使用が必要であることです。昔はフィールドにバリデーターを付けていましたが、現在Vaadin 8ではバインダーにのみバリデーターを付けています。 Vaadinチームは、一部の単純な状況では、バインダーのこの要件が厄介であると判明する可能性があることを認識していますが、ほとんどの場合、検証が必要な状況でもバインディングを実行している可能性が高いと考えています。非常に論理的な再考だと思います。 Vaadinの別の会社のビデオ Webinar:What's new in Vaadin 8? で議論されました。

検証とコンバーター

2つの異なるバリデーターを定義します。1つはコンバーターがユーザーのデータ入力を変換する前に呼び出され、もう1つは変換後に呼び出されます。したがって、流暢なスタイルのwithValidatorおよびwithConverterメソッド呼び出しの順序が、ここでの動作を修正するための鍵となります。もちろん、beforeConversionafterConversionはバリデーターオブジェクトの名前としては不適切ですが、このデモではコンバーターの前または後に実行する意図を明確にするために行っています。

Lambda synaxオプション

1つのバリデーターは従来のJavaメソッドをオーバーライドするコードスタイルを使用します。他のバリデーターはLambda構文を使用します。ビデオを見て、シングルでさらに簡略化されたコードについて Diego D Answer を参照してください。行ラムダ引数。

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

動的なフォームを作成するためにバインダーがない場合はどうなりますか?

Vaadin 8.1は、動的フォームをサポートするフィールドのバインダーの削除をサポートしています。フィールドを非表示にした場合は、そのフィールドのバインダーを削除してください。フィールドを表示するときに、バインダーを再度追加します。

1
Brett Sutton