1

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

例如

<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() 并显示验证错误消息?

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

我已将 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() 将跳过调用应用程序步骤,这是调用视图操作的地方) .

4

1 回答 1

1

你可以检查FacesContext#isValidationFailed()一下。

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

由于您Validator出于某种不清楚的原因手动执行验证而不是使用 JSF 标准(您是否清楚可以指定 avalidator和on ?) <f:validator>,您需要 在验证失败时手动调用。<f:validateXxx><f:viewParam>FacesContext#validationFailed()

于 2012-08-17T10:38:46.107 回答