2013-08-16 4 views
0

Как получить мой валидатор, чтобы поднять ошибку при нулевом значении? Я могу видеть в моих журналах, что, когда я пытаюсь отправить пустое поле, он вызывает валидатор, но он никогда не вызывает onError, поэтому я не могу справиться с этим. Я хочу отобразить сообщение об ошибке в панели обратной связи, когда кто-то пытается отправить пустое поле вместо того, чтобы делать чек в onSubmit моей формы.Валидатор калитки не вызывает ошибку при нулевом значении поля

@Override 
protected void onValidate(IValidatable<String> validatable) { 

    String value = validatable.getValue(); 

    if (value == null) { 
     ValidationError error = new ValidationError(); 
     error.addMessageKey("messageKey"); 
     validatable.error(error); 
    } 

} 

@Override 
public void validateOnNullValue() { 
    return true; 
} 

Редактировать

Если выше не так легко возможно, есть способ, что я могу легко зарегистрировать сообщение об ошибке с панели обратной связи, когда component.setRequired верно и форма представляется с пустой поле? Я просто не хочу, чтобы не было обратной связи с пользователем, когда они пытались отправить форму с пустым полем, но я также не хочу иметь логику для этого в обработчике onSubmit.

редактировать 2 НЕКОТОРЫХ больше контекста

Вот два из полей Я пытаюсь проверить:

final TextField<String> currentLpnField = new TextField<String>("currentLpn", Model.of("")); 
currentLpnField.setOutputMarkupId(true); 
currentLpnField.setRequired(true); 
currentLpnField.add(new BarcodeLPNValidator()); 

final TextField<String> upcField = new TextField<String>("upc", new Model<String>()); 
upcField.setOutputMarkupId(true); 
upcField.setRequired(true); 
upcField.add(new BarcodeUPCValidator()); 

Вот что в моих свойствах файла:

upc.null=UPC cannot be null 
upc.Required=UPC is required 

currentLpn.null=LPN cannot be null 
currentLpn.Required=LPN is required 

Я получаю сообщение * .Required только после того, как я ввел информацию в поле, проверил его, а затем удалю и повторю проверку. Если я просто загружу форму и отправлю ее, даже не введя никаких данных, я ничего не получаю.

+2

Почему вы не задали поле 'setRequired()'? –

+0

Как отобразить сообщение об ошибке в панели обратной связи? Я понимаю, что с setRequired = true валидаторы даже не будут выполняться, если поле пусто. – alexD

+0

setRequired препятствует отправке формы, если поле пусто, но оно все еще не отображает сообщение об ошибке до тех пор, пока некоторые данные не будут введены и не будут удалены. – alexD

ответ

3

Если вы просто хотите проверить поле, если оно не пусто, то установите поле, необходимое:

component.setRequired(Boolean.TRUE); 

Затем, если вы хотите, чтобы обеспечить обратную связь с пользователем, вы должны использовать FeedbackPanel. Настройка feedbackPanel, чтобы быть видимыми, когда есть какие-либо сообщения:

private FeedbackPanel feedbackPanel; 
feedbackPanel = new FeedbackPanel("feedbackPanel") { 
    @Override 
    protected void onConfigure() { 
     super.onConfigure(); 
     setVisible(anyMessage()); 
    } 
}; 
feedbackPanel.setOutputMarkupPlaceholderTag(true); 

Тогда, если вы отправить форму с помощью AJAX вы добавить feedbackPanel в AjaxRequestTarget к тому, что он будет получать повторное rendere и, если таковые имеются (ошибка) сообщения на feedbackPanel будут отображаться сообщения:

AjaxButton btn = new AjaxButton("button") { 
    @Override 
    protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
     super.onSubmit(target, form); 
     target.add(feedbackPanel); 
    } 
}; 

Кроме того, чтобы получить хорошее сообщение об ошибке установить метку для компонента:

component.setLabel(Model.of("Username")); 

Тогда, если ваше поле будет пустым, появится сообщение об ошибке:

Поле «Username» не может быть пустым.

+0

Кроме того, вы можете добавить файл свойств в свой проект, с помощью которого вы можете переопределить значение null-value'error. Добавьте файл под названием «MyPage.properties» (для класса «MyPage», очевидно) и введите пару «ключ-значение» как: myform.mycontainter.mycomponent.null = «Должен представить значение для моего компонента!». – Buurman

+0

Это интересно, потому что, когда я загружаю страницу, если я просто отправлю форму, не касаясь какого-либо из полей, я не получу никаких ошибок. Если я ввешу недопустимое значение в поле, отправьте форму, я получу сообщение об ошибке проверки правильности, как и ожидалось. Если я очищу это поле и повторно отправлю форму, я получаю сообщение об ошибке, которое я ожидаю для нулевого поля, которое определено в моем файле свойств. Почему я не могу получить это сообщение, когда я отправляю форму перед вводом данных, а затем очищая поле? – alexD

0

Если вы просто хотите проверить поле, если оно не пусто, то установите поле, необходимое:

component.setRequired(true); 

Затем добавить ярлык для вас Сообщение об ошибке

component.setLabel(Model.of("Username")); 

Затем добавить аа Обратная связьPanel

FeedbackPanel feedback = new FeedbackPanel("feedback"); 
feedback.setOutputMarkupId(true); 
form.add(feedback); 

Чтобы закончить, вам необходимо @Override метод OnError в вашем AjaxSubmitLink:

add(new AjaxSubmitLink("save", form) { 
    private static final long serialVersionUID = 1L; 
    @Override 
    protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
     super.onSubmit(target, form); 

    } 

    @Override 
    protected void onError(AjaxRequestTarget target, Form<?> form) { 
     super.onError(target, form); 
     target.add(feedback); 
    } 
}); 

Тогда, если ваше поле будет пустым сообщение об ошибке будет:

поле «Имя пользователя» не может быть пустым.

Смежные вопросы