3

マネージドBeanにコードがあります:

public void setTestProp(String newProp) {
   FacesMessage yourFailure = new FacesMessage();
   yourFailure.setDetail("Really you need to promise to never do that again!");
   yourFailure.setSummary("Stop here, now!");
   yourFailure.setSeverity(FacesMessage.SEVERITY_FATAL);
   throw new ValidatorException(yourFailure);
}

XPageでは:

<xp:messages id="messages1" layout="table" showSummary="false"
    showDetail="true" globalOnly="false">
</xp:messages>

しかし、結果メッセージとして表示されます(エラーページではなく、期待どおりに黄色のボックスに表示されます)。

Error setting property 'testProp' in bean of type com.ibm.sg.demo.Test: javax.faces.validator.ValidatorException: Stop here, now!

私はしたいと思います:

  • 技術的な部分はありません
  • 要約を見る

何が恋しいですか?

4

2 に答える 2

3

問題は、プロパティリゾルバが管理対象Beanのget/setメソッドからすべてのjava.lang.Throwableをキャッチすることです。「元の」facesMessageは新しいものに置き換えられます(前のメッセージが追加されます)。

3つの可能性があります。

  1. 独自のプロパティリゾルバーを作成する
  2. 独自のバリデーターを作成し、マネージドBeanにバインドされたフィールドにアタッチします
  3. Beanに検証メソッドを追加します

お役に立てれば

スヴェン

編集:

Beanに検証メソッドを追加する方法

a)Beanに検証メソッドを追加します

public void validate(FacesContext context, UIComponent toValidate,  Object value){

    // Do your validation with value
    // if everything is ok, exit method

    // if not, flag component invalid...
    ((UIInput)toValidate).setValid(false);

    // ... create your message ...
    FacesMessage yourFailure = new FacesMessage();
    yourFailure.setDetail("Really you need to promise to never do that again!");
    yourFailure.setSummary("Stop here, now!");
    yourFailure.setSeverity(FacesMessage.SEVERITY_FATAL);

    context.addMessage(toValidate.getClientId(context),  yourFailure);
}

b)フィールドにバリデーターを追加します

<xp:inputText id="inputText1"
value="#{TBean.test}"
validator="#{TBean.validate}">

(メソッドには任意の名前を付けることができます。)

このバリデーターをfaces-config.xmlに追加する必要はありません。

于 2012-06-20T19:34:15.807 に答える
1

フィールドが検証に失敗したと判断したら、これを行うだけで、必要なものを取得できます。

throw new javax.faces.validator.ValidatorException(new javax.faces.application.FacesMessage("Stop here, now!"));
于 2012-06-20T12:26:38.127 に答える