【问题标题】:How to add Validators in Vaadin 8?如何在 Vaadin 8 中添加验证器?
【发布时间】:2017-07-18 10:16:51
【问题描述】:

在 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);

【问题讨论】:

    标签: java vaadin vaadin8


    【解决方案1】:

    我在这里找到了答案: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);
    

    【讨论】:

    • 如果由于创建动态表单而没有活页夹怎么办?
    【解决方案2】:

    accepted Answer by Diego D 看起来正确。该代码似乎取自 Vaadin 公司 Type safe validation before and after converters 发布的这段非常简短(3 分钟)但非常有用的视频。展示了新的 Vaadin 8 验证方法。我将添加一些注释,展示扩展语法,并为完整的工作应用程序提供完整的示例代码。

    验证器 + 绑定器

    Vaadin 8 的一大区别是验证器需要use of a binder。在过去,您将验证器附加到字段,但现在在 Vaadin 8 中,您仅将验证器附加到活页夹。 Vaadin 团队认识到,对于一些简单的情况,这种对绑定器的要求可能会令人讨厌,但在大多数情况下,他们明智地期望需要验证的情况很可能也会进行绑定。我相信这是一个非常合乎逻辑的重新思考。在另一个 Vaadin 公司视频中进行了讨论,Webinar: What's new in Vaadin 8?

    验证和转换器

    我们定义了两个不同的验证器,一个在转换器转换用户数据条目之前调用,另一个在转换之后调用。因此,流畅风格的withValidatorwithConverter 方法调用的顺序是此处纠正行为的关键。当然,beforeConversionafterConversion 是验证器对象的糟糕名称,但这样做是为了明确在此演示中在转换器之前或之后运行的意图。

    Lambda 语法可选

    一个验证器使用传统的 Java 代码样式覆盖一个方法。另一个验证器使用 Lambda 语法。观看视频并查看 the Diego D Answer 以了解使用单行 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 {
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果由于创建动态表单而没有活页夹怎么办?

      Vaadin 8.1 支持删除支持动态表单的字段的活页夹。 如果您使字段不可见,则删除该字段的活页夹。使字段可见时重新添加活页夹。

      【讨论】:

        猜你喜欢
        • 2017-07-17
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        • 2021-11-08
        • 2019-02-25
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        相关资源
        最近更新 更多