Wicket验证器不会引发空字段值的错误

时间:2013-08-16 20:15:27

标签: java wicket validation

如何让验证程序在空值上引发错误?我可以通过我的日志看到,当我尝试提交一个空字段时,它正在调用验证器,但它永远不会引发onError,所以我无法处理它。当有人试图提交一个空字段而不必在我的表单的提交中签入时,我想在反馈面板中显示错误消息。

@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 个答案:

答案 0 :(得分: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以使其重新呈现,如果有任何(错误)消息,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"));

然后,如果您的字段为空,则错误消息为:

  

“用户名”字段不能为空。

答案 1 :(得分:0)

If you just want to validate a field if it is not empty then set the field required:

component.setRequired(true);

Then add a label for you error message

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

Then add a a FeedbackPanel

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

To finish, you have to @Override the onError method in your 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);
    }
});

Then if your field will be empty the error message will be:

The field 'Username' cannot be empty.