2017-10-19 9 views
0

Vaadin 8에서 모든 양식 데이터를 전송하여 유효성 검사를 완료하는 방법은 무엇입니까? 유감스럽게도 저는 바인더 개념을 이해하지 못합니다. (필자는 필드 유효성 검사를 작성했으나 지금은 무엇을하고 있습니까? 사용자가 필드를 채울 것을 요구할 때 볼 수 있지만 모든 양식의 유효성을 검사하는 쉬운 방법이 있습니까? 내 것은 내 양식이 유효 저장 버튼 내 편집기에서바인더로 양식 유효성 확인

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

확인은 천국을 우리에게이 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; 
    } 

} 

그리고 편집하고 싶습니다. 는 그래서 우리는 다음과 같은 형식을 구축 : bindFields 먼저 전화를 우리가 필요로하는이 양식을 사용하려면

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(); 
    } 
} 

(예를 들어 생성자, 초기화).

컨트롤러보다 우리가 편집하려는 사람과 setDatasource을 호출하십시오.

사용자가 양식을 채우거나 편집 할 수 있고 사용자가 양식을 완성하면 유효성 확인을 통해 양식의 상태를 검색 할 수 있습니다.

필드에서 오류가 발생하면 BinderValidationStatus에서 오류가 발생합니다. https://vaadin.com/docs/v8/framework/datamodel/datamodel-forms.html

+0

에서 더 많은 정보를보기 위해

은 임 :(임이 binder.forField (이) .withValidator (검증) 같은 것을 사용하여 바인딩 개체를 사용하지 않는이 위대한 예를 들어 있지만 내 경우에는 감사 .asRequired 그래서 내 문제는 내 사건으로 유효성 검사를하는 것입니다;) –

+0

유효성 검사를 사용할 수있는 것보다 더 많은 수의 유효성 검사를 사용할 수 있습니다 ("필수"). bind (s -> getValue(), (b, v) 내 예제에서는 VaadinStringEditor에서 상태를 가져옵니다. 어쩌면 당신은 당신이 더 나은 대답을 줄 수 있도록 양식으로 달성하고자하는 목표를 제공 할 수 있습니다. – Tom

+0

@Tom'validate()'메소드에서 인라인 리턴을 사용할 수 있습니다. @Anna K 실제 객체에 바인딩하지 않고 유효성을 검사하려는 경우이 답변 (https://stackoverflow.com/a/46607223/3403011)을 살펴볼 수 있습니다. – Thibstars