Jsf 2 如何清除Validator类中的输入字段?

Jsf 2 如何清除Validator类中的输入字段?,jsf-2,input,reset,validation,Jsf 2,Input,Reset,Validation,在我的应用程序中,我有以下验证程序来验证验证码输入: @Named(value = "simpleCaptchaValidator") @RequestScoped public class SimpleCaptchaValidator implements Validator { @Override public void validate(FacesContext context, UIComponent component, Object value) throws Va

在我的应用程序中,我有以下
验证程序来验证验证码输入:

@Named(value = "simpleCaptchaValidator")
@RequestScoped
public class SimpleCaptchaValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        HttpSession session       = (HttpSession) context.getExternalContext().getSession(false);
        Captcha     secretCaptcha = (Captcha) session.getAttribute(Captcha.NAME);

        // Clear the input field
        EditableValueHolder input = (EditableValueHolder) component;
        input.resetValue();

        // Display an error msg if the entered words are wrong
        if (!secretCaptcha.isCorrect(value.toString())) {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Failed!", "You have entered wrong words.");
            throw new ValidatorException(msg);
        }
    }
}
当用户输入错误的验证码时,上面的
Validator
对于非Ajax请求非常有效。但是,如果用户输入了正确的验证码,但其他组件的验证失败,则验证码的输入字段不会被清除


如果您能告诉我如何解决上述问题,我将不胜感激。

它不起作用,因为
EditableValueHolder#resetValue()
在错误的时刻被调用。您应该在调用应用程序阶段(至少在更新模型值阶段之后)调用它,而不是在验证阶段的中间。也就是说,当
validate()
方法毫无例外地返回时,JSF仍将验证值设置为组件的本地值。通常,当验证阶段失败时,将不会调用更新模型值阶段,并且本地值仍保留在组件中


根据目前提供的信息,不可能提出正确的方法。如果这是自定义组件,则不要在
encode()
期间写入值。或者,如果这是一个现有组件,那么您最好创建一个自定义转换器,将提交的值存储为自定义组件属性,然后在
getAsObject()中返回
null
。在验证器中,您只需获取该自定义组件属性作为值。作为最后手段,附加一个
PhaseListener
,可在适当的时候重置组件。

请显示一些相关的视图代码。我猜如果出现无效验证码,您可能需要从会话中删除该值?session.setAttribute(Captcha.NAME)=“”;非常感谢您的明确解释:)。我会试试你的建议。