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

我以前见过这样的问题。我记得,这是一个 Mojarra 问题。Ajax 调用未在请求中发送 cid 参数,或者未将其正确添加到视图中。要检查的另一件事是 preRenderView 事件的出现侦听器。它也会被 Ajax 请求调用,因此您需要检查它是否是回发并跳过初始化。

于 2012-05-06T04:53:52.690 回答
0

我遇到了同样的问题。这是 JSF 2 不传播对话 ID 的问题。尝试以下解决方法。我假设你有来自你正在使用的p:message的 primefaces。

<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 回答