2012-05-04 3 views
0

У меня проблемы с моим AJAX-событием, и мне было интересно, может ли кто-нибудь помочь мне определить, где я ошибаюсь.f: ajax Невозможно посмотреть мой разговор

У меня есть раскрывающийся список на моей странице, который, когда он изменяется, я хочу, чтобы он обновил еще одну часть этой страницы. Когда я использую страницу без длительной беседы, все работает нормально. Но как только я попытаюсь начать длинный разговор & попробуйте использовать раскрывающийся список, я получаю сообщение «WELD-000321 Не найдено ни одной беседы, чтобы восстановить ошибку id 1». Может ли кто-нибудь подумать о причине этого? Я уверен, что разговор был запущен и доступен для этой страницы. Это выполняется на Tomcat 6 и использует Mojarra 2.1.6, Weld 1.1.5 & PrimeFaces также присутствует (хотя и не участвует в этой части).

Я могу сказать, что ошибка возникает из-за ошибки в моем теге f: ajax. Это вызывает функцию 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> 

CollectionHome:

@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; 
    } 
} 

EntityHome:

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

ответ

0

Я видел вопрос как раньше. Насколько я помню, это вопрос Мохарры. Вызов Ajax не отправляет параметр cid в запрос, или его неправильно добавляется в карту. Еще одна вещь, которую нужно проверить, - это приёмник для события preRenderView. Он также будет вызван для Ajax-запросов, поэтому вы захотите проверить, является ли это сообщение назад и пропустить init.

0

Я столкнулся с той же проблемой. Это проблема с 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" />