如何在Vaadin 8中添加validation器?

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

我在这里找到了答案: 什么是新的

例:

 new Binder().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); 

在此处输入图像描述

Diego D接受的答案看起来是正确的。 该代码看起来取自Vaadin公司发布的非常简短(3分钟)但非常有用的video, 转换器之前和之后的类型安全validation 。 显示新的Vaadin 8validation方法。 我将添加一些注释,显示扩展语法,并为完整的应用程序提供完整的示例代码。

Validator + Binder

Vaadin 8的一个重要区别是validation器需要使用粘合剂 。 在过去,您将validation器附加到字段,但现在在Vaadin 8中,您只将validation器附加到绑定器。 Vaadin团队认识到,对于一些简单的情况,粘合剂的这种要求可能会令人讨厌,但是在大多数情况下,他们明智地期望需要validation的情况很可能也具有约束力。 我相信,这是一个非常合乎逻辑的重新思考。 在另一个Vaadin公司video中讨论, 网络研讨会:Vaadin 8有什么新东西? 。

validation和转换器

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

Lambda synax可选

一个validation器使用传统的Java代码样式覆盖方法。 另一个validation器使用Lambda语法。 观看video并查看Diego D答案 ,了解使用单行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. * 

* 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 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 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支持删除支持动态表单的字段的活页夹。 如果使字段不可见,则删除该字段的绑定器。 使字段可见时重新添加活页夹。