2017-10-19 205 views
0

如何通过发送Vaadin 8中的所有表单数据完成验证?不幸的是,我不明白结合剂的概念:(我写了一个字段验证,但现在呢?它的工作。我的用户看到我什么时候要求他填写一个字段,但有没有简单的方法来验证我的所有表单?我怎么能“告诉”我的保存按钮,我的方式是有效的使用Binder进行表单验证

enter image description here

在我的编辑林定义验证

@SpringComponent 
@PrototypeScope 
public class VaadinStringEditor extends TextField implements HasValueComponent<String> { 

    private Binder<String> binder; 
    BinderValidationStatus<String> status; 
    @PostConstruct 
    public void init() { 
     setWidth("100%"); 
     binder = new Binder<>(); 
    } 

    @Override 
    public void initDefaults() { 
     setValue(""); 
     status = binder.validate(); 

    } 

    @Override 
    public void setConfiguration(EditorConfiguration editorConfiguration) { 
     Validator<String> validator = ((TextFieldConfiguration) editorConfiguration).getValidator(); 
     if (validator != null) { 
      binder.forField(this).withValidator(validator).asRequired("Mandatory").bind(s -> getValue(), 
        (b, v) -> setValue(v)); 

     } 

    public BinderValidationStatus<String> getStatus() { 
    return status; 
    } 

    public void setStatus(BinderValidationStatus<String> status) { 
    this.status = status; 
    } 

    public boolean validate() { 
    BinderValidationStatus<String> status = binder.validate(); 
    return status.isOk(); 
    } 

    } 

} 

我也有一个TextEditorConfiguration补充:

public class TextFieldConfiguration implements EditorConfiguration { 

    private Validator<String> validator; 
    private int validated; 

    public TextFieldConfiguration(Validator<String> validator) { 
     this.validator = validator; 

    } 
    public TextFieldConfiguration() { 
     this.validator = null; 
    } 
    public Validator<String> getValidator() { 
     return validator; 

    } 
    public int getValidated() { 
     return validated; 
    } 
    public void setValidated(int validated) { 
     this.validated = validated; 
    } 
} 

在我的情况下,有很多像DateEditor等编辑器。 UI Valtidation运行良好。由于一个月我无法找到一个方法如何连接它提交按钮,以防止发送表单。

在窗体类我已经定义了例如所有问题 :

question = new AseQuestion(AseQuestionId.DATE_OF_NOTIFICATION, EditorType.DATE_EDITOR); 
question.setDescription(
     "When it happend?"); 
question.setEditorConfiguration(new DateFieldConfiguration(dateRequiredValidator(), dateNotAllowedValidator())); 
return question; 
question = new AseQuestion(AseQuestionId.QUESTION2, EditorType.STRING_EDITOR); 
question.setDescription(" 
      "Write something"); 
private Validator<String> textRequiredValidator() { 
    return Validator.from(v -> v != null && StringUtils.trimAllWhitespace((String) v).length() != 0, 
      "It cannot be empty!!!"); 

和类在那里我有一个提交按钮

public class QuestionWindow extends Window { 
    @Autowired 
    private transient VaadinStringEditor editor; 

    private Button createSaveButton() { 
     Button saveButton = new Button(i18n.getWithDefault("newAseQuestions.save", "Übernehmen")); 

     saveButton.addClickListener(e -> { 
      if (editor.getBinder.validate()) { 
       Notification.show("This is the caption OK", "This is the description", 
         Notification.Type.HUMANIZED_MESSAGE); 
      } else { 
       Notification.show("This is the caption", "This is the description", 
         Notification.Type.HUMANIZED_MESSAGE); 
       System.out.println("kurwa"); 
      } 

      saveAse(); 
     }); 
     return saveButton; 
    } 

回答

2

OK让我们假设我们还没有这个POJO:

public class Person { 
    private String firstname; 
    private String lastname; 

    public String getFirstname() { 
     return firstname; 
    } 

    public void setFirstname(String firstname) { 
     this.firstname = firstname; 
    } 

    public String getLastname() { 
     return lastname; 
    } 

    public void setLastname(String lastname) { 
     this.lastname = lastname; 
    } 

} 

而我们想编辑它。 因此,我们建立如下形式:

public class Form { 
    private TextField firstname; 
    private TextField lastname; 

    private Binder<Person> binder = new Binder<>(); 

    void bindFields() { 
     binder.forField(firstname).withValidator(textRequiredValidator()) 
      .asRequired("Mandatory").bind(Person::getFirstname, Person::setFirstname); 
     binder.forField(lastname).withValidator(textRequiredValidator()) 
      .asRequired("Mandatory").bind(Person::getLastname, Person::setLastname); 
    } 

    public void setDatasource(Person person) { 
     binder.setBean(person); 
    } 

    private Validator<String> textRequiredValidator() { 
     return Validator.from(v -> v != null && StringUtils.trimAllWhitespace((String) v).length() != 0, 
      "It cannot be empty!!!"); 
    } 

    public boolean validate() { 
     BinderValidationStatus<Person> status = binder.validate(); 
     return status.isOk(); 
    } 
} 

为了利用这种形式,我们需要调用bindFields第一(例如构造函数初始化)。

比控制器或所以调用setDatasource与我们想要编辑的人。

之后,用户可以填写或编辑表格,当用户完成表格的状态时,可以通过验证检索。

如果您需要来自BinderValidationStatus的字段中的错误。

欲了解更多信息,看看https://vaadin.com/docs/v8/framework/datamodel/datamodel-forms.html

+0

谢谢你为这个伟大的例子,但在我的情况我不是用任何物体:(即时通讯使用这样的事情binder.forField(本).withValidator(验证)绑定.asRequired (“强制”)。bind(s - > getValue(), (b,v) - > setValue(v));所以我的问题是如何做我的情况验证;) –

+0

比你可以使用验证mehtod从我的例子中获取VaadinStringEditor的状态。也许你可以提供你想要达到的目标,所以我可以给你一个更好的答案。 – Tom

+0

@Tom你可以在你的'validate()'方法中使用内联返回。 @Anna K如果您想要验证而不绑定到实际对象,您可能需要查看此答案:https://stackoverflow.com/a/46607223/3403011。 – Thibstars