如何在验证失败时跳过PreRenderView事件?

时间:2012-08-17 04:30:51

标签: validation jsf jsf-2

我有一个用例,我想在其中验证一堆viewParams,如果发现验证错误,请跳过preRenderView事件并显示错误消息。这可能吗?

e.g。

<f:metadata>
            <f:viewParam id="param1" name="p1" value="#{someBean.param1}" />
            <f:viewParam id="param2" name="p2" value="#{someBean.param2}" />
            <f:event type="javax.faces.event.PostValidateEvent" listener="#{someBean.validateParams}" />
            <f:event type="javax.faces.event.PreRenderViewEvent" listener="#{someBean.viewAction}" />
        </f:metadata>

方法validateParams()用于进行多字段验证,可能会是这样的:

    public void validateParams(ComponentSystemEvent event) {
       UIComponent source = event.getComponent();

       Integer value1 = (Integer) ((UIInput) source.findComponent("param1")).getLocalValue();
       Integer value2 = (Integer) ((UIInput) source.findComponent("param2")).getLocalValue();

       boolean valid1 = validOneField(value1);
       boolean valid2 = validOneField(value2);
       boolean valid12 = validBothFields(valid1, valid2);

       if(!valid1);//add facesMessage
       if(!valid2);//add facesMessage
       if(!valid12);//add facesMessage

       if (!valid1 || !valid2 || !valid12)
          FacesContext.getCurrentInstance().renderResponse();
    }

我的理解是,无论强制渲染响应如何,仍然会调用viewAction()。我可以轻松修改viewAction()以考虑验证,但我想完全跳过它由于其他原因(该方法中的一些杂乱的代码,我宁愿不触摸,等等)。有没有办法可以完全绕过viewAction()并显示验证错误消息?

编辑:使用FaceusContext.getCurrentInstance()的BalusC建议.ValidationFailed()

我已将validateParams()修改为:

    public void validateParams(ComponentSystemEvent event) {
       UIComponent source = event.getComponent();

       Integer value1 = (Integer) ((UIInput) source.findComponent("param1")).getLocalValue();
       Integer value2 = (Integer) ((UIInput) source.findComponent("param2")).getLocalValue();

       boolean valid1 = validOneField(value1);
       boolean valid2 = validOneField(value2);
       boolean valid12 = validBothFields(valid1, valid2);

       if(!valid1);//add facesMessage
       if(!valid2);//add facesMessage
       if(!valid12);//add facesMessage

       if (!valid1 || !valid2 || !valid12)
          FacesContext.getCurrentInstance().ValidationFailed();
          FacesContext.getCurrentInstance().renderResponse();
    }

和修改后的viewAction()如下:

public void viewAction(ComponentSystemEvent cse) {
    if(!FacesContext.getCurrentInstance().isValidationFailed()) {
        // viewAction() code
    }
}

这似乎对我有用。希望JSF 2.2中的视图操作不需要我检查验证是否失败,因为我相信它们根本不会被调用(FacesContext.renderResponce()将跳过调用应用程序步骤,这是调用视图操作的地方)

1 个答案:

答案 0 :(得分:1)

您可以查看FacesContext#isValidationFailed()

public void viewAction() {
    if (!FacesContext.getCurrentInstance().isValidationFailed()) {
        // ...
    }
}

由于某些不明原因,您手动执行验证而不是使用JSF标准Validator(您是否知道可以指定validator<f:validator>和{{1在<f:validateXxx>?)上,您需要在验证失败时手动调用<f:viewParam>