Java 如何检查Wicket文本字段中的空值?

Java 如何检查Wicket文本字段中的空值?,java,wicket,Java,Wicket,我有一个Wicket Textfield,其中包含一个整数值 currentValueTextField = new TextField<IntParameter>("valueText", new PropertyModel<IntParameter>(model, "value")); 验证程序类是 class IntegerValidator extends AbstractValidator<IntParameter> { private stat

我有一个Wicket Textfield,其中包含一个整数值

currentValueTextField = new TextField<IntParameter>("valueText", new PropertyModel<IntParameter>(model, "value"));
验证程序类是

class IntegerValidator extends AbstractValidator<IntParameter> {

private static final long serialVersionUID = 5899174401360212883L;

public IntegerValidator() {
}

@Override
public void onValidate(IValidatable<IntParameter> validatable) {
    ValidationError error = new ValidationError();
    if (model.getValue() == null) {
        AttributeAppender redOutline = new AttributeAppender("style", new Model<String>("border-style:solid; border-color:#f86b5c; border-width: 3px"), ";");
        currentValueTextField.add(redOutline);
        currentValueTextField.getParent().getParent().add(redOutline);
        validatable.error(error);
        }
    }
}
类IntegerValidator扩展了AbstractValidator{
私有静态最终长serialVersionUID=5899174401360212883L;
公共集成验证器(){
}
@凌驾
public void onValidate(IValidatable validatable){
ValidationError error=新的ValidationError();
if(model.getValue()==null){
AttributeAppender redOutline=新的AttributeAppender(“样式”,新模型(“边框样式:纯色;边框颜色:#f86b5c;边框宽度:3px”),“;”;
currentValueTextField.add(redOutline);
currentValueTextField.getParent().getParent().add(redOutline);
可验证。错误(error);
}
}
}
但是,如果我在文本字段中不键入任何内容,则不会调用我的
onValidate()
方法

在这种情况下,检查空值的推荐方法是什么?
我还想对输入的值进行范围检查。

覆盖
validateOnNullValue()
,默认情况下为
false

@Override
public boolean validateOnNullValue()
{
     return true;
}
以下是
validateOnNullValue()
方法的说明:

指示是否验证值(如果值为
null
)。如果值为
null
,通常需要跳过验证,除非我们希望确保 该值实际上是
null
(一个罕见的用例)。扩展此和 要确保值为
null
应覆盖此方法并返回
true

就打电话

currentValueTextField.setRequired(true);
将字段标记为所需,并让Wicket自己处理空值。每个输入字段可以轻松组合多个验证器

任何特殊的错误处理,如添加红色边框或显示错误消息,都可以在表单的
onError
方法中实现,或者通过将
feedbackorder
s添加到适当的字段中来实现。

更好(且可重复使用)的方法是重写行为的
isEnabled(Component)
方法:

public class HomePage extends WebPage {
    private Integer value;
    public HomePage() {
        add(new FeedbackPanel("feedback"));
        add(new Form("form", new CompoundPropertyModel(this))
            .add(new TextField("value")
                .setRequired(true)
                .add(new ErrorDecorationBehavior()))
            .add(new Button("submit") {
                @Override
                public void onSubmit() {
                    info(value.toString());
                }
            }));
    }
}

class ErrorDecorationBehavior extends AttributeAppender {
    public ErrorDecorationBehavior() {
        super("style", true, Model.of("border-style:solid; border-color:#f86b5c; border-width: 3px"), ",");
    }
    @Override
    public boolean isEnabled(Component component) {
        return super.isEnabled(component) && component.hasErrorMessage();
    }
}
现在您需要自定义错误消息。所以子类FeedbackPanel

您可以在以下内容中找到更多信息


将此类添加到表单或组件中

我不知道Wicket的情况,但我知道在其他web框架中,空文本字段不会调用验证。有些为其标记提供附加标志,以启用/禁用所需的检查,而有些则可能在将表单值放入模型时必须执行检查(或随后检查模型)。重写validateOnNullValue()会导致调用我的验证器,但有趣的是,我的模型中的值没有设置为null。因此,我的验证程序代码不会引发错误,因为它认为textfield具有非空值。嗯。。。但是
null
必须在这里
validable.getValue()
,当您通过抛出验证器时,该值仍然没有在模型上设置。请注意,现在您希望在大多数情况下直接使用IValidator,Wicket 6中的InulLaccessingValidator。这里的问题是我无法控制如何指示错误。我想在文本字段中添加一个红色边框,但wicket会在反馈面板中显示一条错误消息。我不想使用反馈面板。@AndrewFielden可以通过为表单实现onError()来存档此面板。我扩展了我的答案来涵盖这一点。谢谢。写维克特的人什么都想好了。
public class HomePage extends WebPage {
    private Integer value;
    public HomePage() {
        add(new FeedbackPanel("feedback"));
        add(new Form("form", new CompoundPropertyModel(this))
            .add(new TextField("value")
                .setRequired(true)
                .add(new ErrorDecorationBehavior()))
            .add(new Button("submit") {
                @Override
                public void onSubmit() {
                    info(value.toString());
                }
            }));
    }
}

class ErrorDecorationBehavior extends AttributeAppender {
    public ErrorDecorationBehavior() {
        super("style", true, Model.of("border-style:solid; border-color:#f86b5c; border-width: 3px"), ",");
    }
    @Override
    public boolean isEnabled(Component component) {
        return super.isEnabled(component) && component.hasErrorMessage();
    }
}
currentValueTextField.setRequired(true);