我的 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();
}
}
}