4

これをよりよく理解するためにあなたの助けが必要です。これは私の場合です。フォームの入力コントロールごとにカスタムバリデーターがあります。したがって、検証エラーが発生した場合は、対応するFacesMessageをvalidateメソッドに追加します。私の理解では、検証エラーがある場合、またはカスタムバリデーターのvalidateメソッドにFacesMessagesが追加されている場合、INVOKE APPLICATIONフェーズをスキップし、RENDERRESPONSEPHASEを直接呼び出します。プロセス検証フェーズ-これは正しいですか?

私が直面している問題は、検証エラーのために、プロセス検証フェーズでFacesMessageを追加し、INVOKEAPPLICATIONPHASEでユーザーが実行したアクションの確認メッセージを追加することです。 RENDER RESPONSEフェーズのページ?-上記の質問で私の理解が正しければ-現在のFacesContextにFacesMessagesがないことを確認した後、条件付きで確認FacesMessageを追加するのがベストプラクティスですか?

これがメッセージの追加方法です:

FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR,Constants.invalidMessageDetail,null);
         FacesContext.getCurrentInstance().addMessage(null, facesMessage);
throw new ValidatorException(facesMessage);

表示方法は次のとおりです。

<h:messages errorClass="ErrorMsg" warnClass="WarningMsg" infoClass="InfoMsg" layout="table"  />

あなたの助けに感謝。

4

1 に答える 1

7

私の理解では、検証エラーがある場合、またはカスタムバリデーターのvalidateメソッドにFacesMessagesが追加されている場合、INVOKE APPLICATIONフェーズをスキップし、RENDERRESPONSEPHASEを直接呼び出します。プロセス検証フェーズ-これは正しいですか?

部分的に真実。単にaがに追加された場合ではなく、aValidatorExceptionスローされた場合にのみ、モデル値の更新をスキップしてアプリケーションフェーズを呼び出します。FacesMessageFacesContext

上記の質問で私の理解が正しければ、現在のFacesContextにFacesMessagesがないことを確認した後、条件付きで確認FacesMessageを追加するのがベストプラクティスですか?

次のように投げる必要がありValidatorExceptionます:

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if (value does not meet conditions) {
        throw new ValidatorException(new FacesMessage("value does not meet conditions"));
    }
}

次に、モデル値の更新をスキップし、必要に応じてアプリケーションフェーズを呼び出します。顔のメッセージをコンテキストに手動で追加する必要はないことに注意してください。JSFは、をキャッチすると、それをすべて単独で実行しますValidatorException

于 2010-06-01T11:16:55.533 に答える