Java 如何在Vaadin 8中添加验证器?

Java 如何在Vaadin 8中添加验证器?,java,vaadin,vaadin8,Java,Vaadin,Vaadin8,在vaadin7中有一个addValidator函数,但在vaadin8中它不存在 瓦丁7例: TextField user = new TextField("User:"); user.setRequired(true); user.setInputPrompt("Your username"); user.addValidator(new NullValidator("Username can't be empty", false)); user.setInva

在vaadin7中有一个addValidator函数,但在vaadin8中它不存在

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

例如:

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);
newbinder().forField(tf)
.withValidator(str->str.length()==4,“必须是4个字符”)
.withConverter(新的StringToIntegerConverter(“必须是整数”))
.withValidator(整数->整数.equals(2017),“错误日期”)
.bind(Person::getBirthYear,Person::setBirthYear);

这张照片看起来很正确。这段代码看起来取自这段非常简短(3分钟)但非常有用的视频,该视频由Vaadin公司发布。显示了新的Vaadin 8验证方法。我将添加一些注释,显示扩展的语法,并为一个完整的工作应用程序提供完整的示例代码

验证器+活页夹 Vaadin 8的一大区别是,验证器需要。过去,您将验证器附加到字段,但现在在Vaadin 8中,您仅将验证器附加到活页夹。Vaadin团队认识到,对于一些简单的情况,对活页夹的这种要求可能会令人恼火,但在大多数情况下,他们明智地认为需要验证的情况也很可能会进行绑定。我相信这是一个非常合乎逻辑的重新思考。在另一个瓦丁公司视频中讨论

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

Lambda synax可选 一个验证器使用传统的Java代码样式重写方法。另一个验证器使用Lambda语法。观看视频并查看使用单行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 {
    }
}
package com.example.valapp;
导入com.vaadin.annotations.Theme;
导入com.vaadin.annotations.VaadinServletConfiguration;
导入com.vaadin.data.Binder;
导入com.vaadin.data.ValidationResult;
导入com.vaadin.data.Validator;
导入com.vaadin.data.ValueContext;
导入com.vaadin.data.converter.StringToIntegerConverter;
导入com.vaadin.server.vaadin请求;
导入com.vaadin.server.VaadinServlet;
导入com.vaadin.ui.*;
导入javax.servlet.annotation.WebServlet;
/**
*此UI是应用程序入口点。UI可以表示浏览器窗口
*(或选项卡)或嵌入Vaadin应用程序的html页面的某些部分。
*
*UI是使用{@link#init(VaadinRequest)}初始化的。该方法旨在:
*重写以将组件添加到用户界面并初始化非组件功能。
*/
@主题(“神话主题”)
公共类MyUI扩展了MyUI{
@凌驾
受保护的无效初始(最终VaadinRequest VaadinRequest){
最终文本字段tf=新文本字段(“输入出生年份:”);
转换前验证程序=新验证程序(){
@凌驾
公共验证结果应用(字符串s,ValueContext ValueContext){
如果(s.length()!=4){
return ValidationResult.error(“年份必须由4位数字组成”);
}否则{
返回ValidationResult.ok();
}
}
} ;
Validator afterConversion=Validator.from(value->value.equals(2017),“错误年份”);
新活页夹()
福菲尔德先生(tf)
.带验证器(转换前)
.withConverter(新的StringToIntegerConverter(“输入必须是整数”))
.带验证器(转换后)
.bind(Person::getYearOfBirth,Person::setYearOfBirth);
按钮按钮=新按钮(“告诉我”);
button.addClickListener(事件->通知.show(“这是标题”,“这是描述”,通知.Type.HUMANIZED_消息));
设置内容(新垂直布局(tf,按钮));
}
@WebServlet(urlPatterns=“/*”,name=“MyUIServlet”,asyncSupported=true)
@VaadinServletConfiguration(ui=MyUI.class,productionMode=false)
公共静态类MyUIServlet扩展了VaadinServlet{
}
}

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

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

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