0

私はこのようなxhtmlを持っています:

<a4j:outputPanel id="displayGraph" layout="block" style="clear:both; margin-top: 0px; margin-left: 80px;margin-bottom: 20px;">
        <a4j:mediaOutput element="img"  cacheable="false" session="false" createContent="#{generateGraph.paint}" value="#{graph}" mimeType="image/png" standby="Loading" /> 
    </a4j:outputPanel>

    <a4j:outputPanel id="errorMessage" ajaxRendered="true">
        <h:messages id="messages" styleClass="message" errorClass="errormsg" infoClass="infomsg" warnClass="warnmsg"/>
    </a4j:outputPanel>

また、メソッドが例外を発生させた場合にメッセージを生成するバッキング Bean にペイント メソッドがあります。このような:

public void paint(OutputStream os, Object data) {
    try{ 
           //some actions
  } catch (IOException e) {
      e.printStackTrace();
      FacesMessages.instance().add(Severity.ERROR, "Sorry connection can not be achieved");
  }

} else {
      FacesMessages.instance().add(Severity.ERROR, "Sorry server does not exist");

}

}

メッセージは表示されなくなりました。誰かが私が間違っていることを親切に教えてもらえますか?

前もって感謝します

4

1 に答える 1

0

FacesMessages は会話スコープの seam コンポーネントです。一時的な会話を使用していると仮定すると、次のようになります。

  1. JSF ページへの最初のリクエスト。一時的な会話 #1 が作成されました。
  2. JSF ページがレンダリングされ、会話 #1 が強制終了されました。
  3. mediaOutput の AJAX 要求。一時的な会話 #2 が作成されました。
  4. イメージがレンダリングされます。会話 #2 にバインドされた FacesMessages オブジェクト。
  5. 画像が返ってきました。会話 #2 が殺されました。
  6. a4j:outputPanel は ajaxRendered です。一時的な会話 #3 が作成されました。
  7. 空の FacesMessages が会話 #3 でレンダリングされます。

これをテストする#{conversation.id}には、a4j:outputPanels の両方に含め、paint()メソッドに会話 ID を記録します。

この問題には 2 つの解決策があります。長時間の会話を開始して、mediaOutput に追加します。もう 1 つの解決策は、FacesMessages を使用せずに、PAGE スコープのカスタム コンポーネントを使用してメッセージを保持することです。

また、すべての richfaces コンポーネントに「render」引数が含まれている RichFaces4 に切り替えることもできます。これにより、最初の mediaOutput AJAX リクエストと同じリクエストで再レンダリングが確実に発行されます。

于 2012-01-03T15:26:44.833 に答える