Validation 如果值已更改,如何签入验证器?

Validation 如果值已更改,如何签入验证器?,validation,jsf,default-value,Validation,Jsf,Default Value,我知道我可以通过UIInput#getValue()获取旧值 但在许多情况下,如果字段绑定到bean值,我希望得到默认值,如果输入等于默认值,则无需验证该值 如果某个字段具有唯一约束,并且您有一个编辑表单,则此选项非常有用。 验证将始终失败,因为在检查约束方法中,它将始终找到自己的值,从而验证为false 一种方法是使用将该默认值作为属性传递,并在验证器内部进行检查。但是有更简单的内置方法吗?提交的值仅作为validate()实现中的value参数可用 public void validate(

我知道我可以通过
UIInput#getValue()
获取旧值

但在许多情况下,如果字段绑定到bean值,我希望得到默认值,如果输入等于默认值,则无需验证该值

如果某个字段具有唯一约束,并且您有一个编辑表单,则此选项非常有用。
验证将始终失败,因为在检查约束方法中,它将始终找到自己的值,从而验证为false


一种方法是使用
将该默认值作为属性传递,并在验证器内部进行检查。但是有更简单的内置方法吗?

提交的值仅作为
validate()
实现中的
value
参数可用

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    Object oldValue = ((UIInput) component).getValue();

    if (value != null ? value.equals(oldValue) : oldValue == null) {
        // Value has not changed.
        return;
    }

    // Continue validation here.
}
另一种方法是将
验证器
设计为
值更改侦听器
。只有当值真正改变时,才会调用它。它有点粗糙,但它能做你真正需要的工作

<h:inputText ... valueChangeListener="#{uniqueValueValidator}" />

请注意,您不能在那里抛出
验证异常
,这就是为什么需要手动将组件和面上下文都设置为无效,并手动为组件添加消息的原因。
context.validationFailed()
将迫使JSF跳过更新模型值和调用操作阶段。

Haha,在您添加getValue()方法的同时,我也测试了它,并想把它写下来^^。这个解决方案要好得多。有时候事情太明显了,你一刻也看不见;)我甚至在我的问题中找到了答案?我认为getValue将始终获得旧值。抱歉浪费你的时间。你好。我遵循了这一点,但由于某种原因,如果我去另一个领域,它会一直抓住焦点。我该怎么解决这个问题呢?stackoverflow和BalusC,这是一份不断赠送的礼物!可能重复的
<h:inputText ...>
    <f:valueChangeListener binding="#{uniqueValueValidator}" />
</h:inputText>
@ManagedBean
public class UniqueValueValidator implements ValueChangeListener {

    @Override
    public void processValueChange(ValueChangeEvent event) throws AbortProcessingException {
        FacesContext context = FacesContext.getCurrentInstance();
        UIInput input = (UIInput) event.getComponent();
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();

        // Validate newValue here against DB or something.
        // ...

        if (invalid) {
            input.setValid(false);
            context.validationFailed();
            context.addMessage(input.getClientId(context),
                new FacesMessage(FacesMessage.SEVERITY_ERROR, "Please enter unique value", null));
        }
    }

}