2017-10-19 256 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