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에서는 대화 ID를 전달하지 않기 때문에 발생하는 문제입니다. 아래의 해결 방법을 시도해보십시오. 나는 p : 메시지에서 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" /> 
관련 문제