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()) {
        // ...
    }
}

何らかの理由でJSF標準を使用する代わりに手動で検証を実行しているため( 、、およびをValidator指定できることを十分に認識していますか?)、 検証の失敗時に手動で呼び出す必要があります。validator<f:validator><f:validateXxx><f:viewParam>FacesContext#validationFailed()

于 2012-08-17T10:38:46.107 に答える