2017-10-10 118 views
0

我试着写在Vaadin验证,但我不知道如何检查,如果日期字段为空Vaadin验证日期,而不是空

我写了这样的事情

@Override 
    public void setConfiguration(EditorConfiguration editorConfiguration) { 
    boolean required = ((DateFieldConfiguration) editorConfiguration).isRequired(); 
    if (required == true) { 
     setRequiredIndicatorVisible(true); 
     addValueChangeListener(event -> validate(event.getSource().getDefaultValidator(), event.getValue())); 

    } 

} 

    private void validate(Validator<LocalDate> defaultValidator, LocalDate localDate) { 

     binder.forField(this).withValidator(validator).asRequired("Mandatory").bind(s -> getValue(), 
      (b, v) -> setValue(v)); 

} 

我已经achived一个验证与文本字段:

enter image description here

字符串验证码

public class VaadinStringEditor extends TextField implements HasValueComponent<String> { 

/** 
* 
*/ 
private static final long serialVersionUID = 6271513226609012483L; 
private Binder<String> binder; 

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

@Override 
public void initDefaults() { 
    setValue(""); 
    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)); 

    } 

,我有效的在这里:

question.setEditorConfiguration(new TextFieldConfiguration(textRequiredValidator())); 

验证:

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

根据[Vaadin文档](https://vaadin.com/docs/v8/framework/datamodel/datamodel-forms.html#datamodel.forms.validation),一旦设置了字段'asRequired(message) '(或添加其他验证器之后),您可以在_Ok_按钮中单击侦听器(或您在其中的任何位置)调用'binder.validate()'。你卡在哪里? – Morfic

+0

我不知道如何获取LocalDate并检查它是否为空binder.forField(this).withValidator(validator).asRequired(“Mandatory”)。bind(s - > getValue(), (b,v) - > setValue(v));你知道如何为localDate写验证器吗 –

+0

你读过文档吗?这不是你必须检查价值。活页夹将使用已定义的验证器来检查值,如果它们全部通过,则更新绑定bean上的值。 – Morfic

回答

0

您应该使用com.vaadin.ui.DateFieldLocalDate值。看看下面的例子。

实例豆:

public class MyBean { 
    private LocalDate created; 

    public LocalDate getCreated() { 
     return created; 
    } 

    public void setCreated(LocalDate created) { 
     this.created = created; 
    } 
} 

编辑

DateField dateField = new DateField("Date selector"); 
binder.forField(dateField) 
     .bind(MyBean::getCreated, MyBean::setCreated); 

如果由于某种原因,你想有com.vaadin.ui.TextField编辑日期,然后你需要设置转换器是这样的:

Binder<MyBean> binder = new Binder<>(); 
TextField textDateField = new TextField("Date here:"); 
binder.forField(textDateField) 
     .withNullRepresentation("") 
     .withConverter(new StringToLocalDateConverter()) 
     .bind(MyBean::getCreated, MyBean::setCreated); 

转换器实现:

public class StringToLocalDateConverter implements Converter<String, LocalDate> { 
    @Override 
    public Result<LocalDate> convertToModel(String userInput, ValueContext valueContext) { 
     try { 
      return Result.ok(LocalDate.parse(userInput)); 
     } catch (RuntimeException e) { 
      return Result.error("Invalid value"); 
     } 
    } 

    @Override 
    public String convertToPresentation(LocalDate value, ValueContext valueContext) { 
     return Objects.toString(value, ""); 
    } 
} 

请注意,此转换器不利用ValueContext对象,该对象包含更复杂情况下应考虑的信息。例如,应该处理用户区域设置。