【问题标题】:Validator not firing验证器未触发
【发布时间】:2011-02-08 11:17:05
【问题描述】:

我有这个组件:

<ice:form style="width: 45%;" partialSubmit="true" >
    <ice:inputText id="cc" required="true" partialSubmit="true" immediate="true"
        value="#{userAction.username}">
        <f:validator validatorId="passwordValidator" />
        <ice:message style="color: red;" id="ageError" for="cc" />
    </ice:inputText>
</ice:form>

我已经在 faces config 中声明了验证器:

<validator>
    <validator-id>passwordValidator</validator-id>
    <validator-class>com.mydomain.seam_icefaces_test.action.PasswordValidator</validator-class>
</validator>

还有验证器java类:

   package com.mydomain.seam_icefaces_test.action;

import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

    import org.jboss.seam.faces.FacesMessages;

    public class PasswordValidator implements Validator {

        @Override
        public void validate(FacesContext arg0, UIComponent arg1, Object value)
                throws ValidatorException {
            String val = (String) value;

            if (val.length() == 0)
                ((UIInput) arg1).setValid(false);
            FacesMessages.instance().addToControlFromResourceBundle(arg1.getId(),
                    "invalid.password");

        }
    }

我不明白为什么它在失去焦点时没有触发......

你有什么想法吗?

谢谢。

【问题讨论】:

  • 所以你按下提交按钮,验证没有触发?
  • 我不推送任何东西...partialSubmit 和 inputText 组件的立即属性知道自动执行 POST...
  • 是错字还是你真的写了immediat而不是`立即`?
  • 对不起,这里是错误的,但在程序中是正确的。
  • 只是为了测试验证器是否正确,添加一个 并查看验证器是否正在触发

标签: java jsf icefaces


【解决方案1】:

JSF 验证器在验证过程中被调用。当控制失去焦点时,它们不会被调用。请参阅lifecycle。

【讨论】:

  • 是的,但我设置了 immediate=true (在组件上使用 immediate 属性意味着它的值将在 JSF 生命周期的应用请求值阶段进行验证。)并且仍然没有触发。
【解决方案2】:

一些事情......你的代码的最后一部分不应该像

if (val.length() == 0)
{
    ((UIInput) arg1).setValid(false);
    FacesMessages.instance().addToControlFromResourceBundle(arg1.getId(),
                    "invalid.password");
}

?这可能是您的消息未显示的原因。

其次,Immediate 属性不是必需的。您可以尝试在没有它的情况下工作。

最后,尝试在&lt;ice:inputText&gt; 标记中使用validator="#{MyBean.validatePassword}" 属性,其中validatePassword 是PasswordValidator 类中validate 方法的副本。

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 2023-03-10
    • 1970-01-01
    • 2014-05-11
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多