0

AJAX イベントに少し問題があり、どこが間違っているのかを誰かが教えてくれるかどうか疑問に思っていました。

ページにドロップダウンがあり、それが変更されたときに、このページの別の部分を更新する必要があります。会話を長時間実行しないでページを使用すると、すべて正常に動作します。しかし、長時間の会話を開始してドロップダウン ボックスを使用しようとするとすぐに、「WELD-000321 ID 1 の復元する会話が見つかりませんでした」というエラーが表示されます。誰かがこれの理由を考えることができますか? 会話が開始され、ページで利用できると確信しています。これは Tomcat 6 で実行され、Mojarra 2.1.6、Weld 1.1.5 を使用し、PrimeFaces も使用されます (ただし、この部分には関係しません)。

f:ajax タグの onerror が原因でエラーが発生していることがわかります。これは、発生しているエラー オブジェクトを出力する JavaScript 関数を呼び出しています。最初のページ リクエストのコードをデバッグすると、会話が開始され、会話を出力するコードの一部 (#{collectionHome.conversation}) が会話を返します。

私のコードの縮小版は次のとおりです。

フォーム:

<ui:define name="metadata">
  <f:metadata>
    <f:event type="preRenderView" listener="#{collectionHome.init(true)}" />
  </f:metadata>
</ui:define>

<ui:define name="content">
  <h:form id="modalForm" class="modalForm">
    <ul class="layout form">
      <li>
        <label for="type" class="required">Type:</label>
        <h:selectOneMenu id="type" value="#{collectionHome.selectedCollectionType}">
          <f:selectItems value="#{collectionHome.types}" var="colType" itemLabel="#{colType.displayName}" itemValue="#{colType}"/>
          <f:ajax event="change" listener="#{collectionHome.switchType}" onerror="handleError" render="@form" />
        </h:selectOneMenu>
        <p:message id="typeMsg" for="type" />
      </li>
      <li>
        <p>#{collectionHome.conversation}</p>
      </li>
      <h:panelGroup rendered="#{collectionHome.selectedCollectionType eq 'IMAGE'}">
        <li>
          <!-- Content to show/hide goes here -->
        </li>
      </h:panelGroup>
    </ul>
  </h:form>
</ui:define>

コレクションホーム:

@Named("collectionHome")
public class CollectionHome extends EntityHome<FileCollection> implements Serializable {
  private CollectionTypes selectedCollectionType;

  public boolean doInit() {
    return true;
  }

  public String switchType(AjaxBehaviorEvent event) {
    switch (selectedCollectionType) {
      case IMAGE:
        setEntity(new ImageCollection(getEntity()));
        break;
      case DOCUMENT:
        setEntity(new DocumentCollection(getEntity()));
        break;
      default:
        break;
    }
    return OutcomeStrings.SUCCESS;
  }
}

エンティティホーム:

@ConversationScoped
public abstract class EntityHome<T extends BaseEntity> {
  @Inject
  private Conversation conversation;

  public void init(boolean startConversation) throws AuthenticationException {
    if (doInit()) {
      if (startConversation) {
        beginConversation();
      }
      postInit();
    }
  }
}
4

2 に答える 2

0

私は以前にこのような問題を見てきました。私が思い出したように、それはモハラの問題です。Ajax 呼び出しがリクエストで cid パラメーターを送信していないか、ビューマップに正しく追加されていません。もう 1 つ確認することは、preRenderView イベントのアドベント リスナーです。Ajax リクエストでも呼び出されるため、ポストバックかどうかを確認して init をスキップする必要があります。

于 2012-05-06T04:53:52.690 に答える
0

同じ問題が発生しました。これは、会話 ID を伝搬しないという JSF 2 の問題です。以下の回避策を試してください。使用しているp:messageのプライムフェイスがあると仮定しています。

<h:selectOneMenu id="type" value="#{collectionHome.selectedCollectionType}" onchange="saveCollection([{name:'cid',value:'#{javax.enterprise.context.conversation.id}'}])">
      <f:selectItems value="#{collectionHome.types}" var="colType" itemLabel="#{colType.displayName}" itemValue="#{colType}"/>
</h:selectOneMenu>
<p:remoteCommand name="saveCollection" action="#{collectionHome.switchType}"
                                 process="type" />
于 2014-08-07T14:14:02.040 に答える