一連の 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() は、ビュー アクションが呼び出されるアプリケーションの呼び出しステップをスキップします)。 .