2016-11-29 2 views
0

У меня есть приложение Xpage, которое использует библиотеку расширений, где xsp.extlib.convstate является «null» для одного из трех пользователей, пока не обновит страницу вручную. Все три пользователя получают доступ к приложению через RDP, используя Citrix и интернет-параметры, одинаковые для всех трех. Попытка выяснить, почему это происходит. Приложение находится только на одном сервере 9.0.1.xsp.extlib.convstate возвращает null

+0

При первом доступе к приложению? когда он равен нулю? т.е. как вы к нему обращаетесь? –

ответ

0

Судя по исходному коду, если не было conversationState инициализируются все же, conversationState бы не инициализирован, пока либо:

  1. после фазы рендера Response (в фазе слушателя: com.ibm.xsp.extlib.component.layout.impl.ApplicationPhaseListener)

    @SuppressWarnings("unchecked") // $NON-NLS-1$ 
    public void afterPhase(PhaseEvent event) { 
        if(event.getPhaseId()==PhaseId.RENDER_RESPONSE) { 
         // After the render phase, we save the conversion state 
         ConversationState.saveInSession(event.getFacesContext()); 
        } 
    } 
    
  2. в методе SetParent в UIApplicationLayout, и это, кажется, охраняют состояние «isRestoringState», что означает, что я не» я думаю, что это d запускается на первом представлении страницы, так как не будет никакого состояния для восстановления.

    @Override 
    public void setParent(UIComponent parent) { 
        super.setParent(parent); 
        if(null == parent){ // removing parent 
         return; 
        } 
    
        // TODO should move this initialization to initBeforeContents instead 
        FacesContextEx context = (FacesContextEx) getFacesContext(); 
        if(null != context && !context.isRestoringState()) { 
         ConversationState cs = ConversationState.get(context, FacesUtil.getViewRoot(this), true); 
    
         // Initialize the conversation state 
         // Set the current navigation path to the UserBean 
         ApplicationConfiguration conf = findConfiguration(); 
         if(conf!=null) { 
          String navPath = conf.getNavigationPath(); 
          if(StringUtil.isEmpty(navPath)) { 
           // If there isn't a navigation path that is defined, the use the default one 
           if(StringUtil.isEmpty(cs.getNavigationPath())) { 
            navPath = conf.getDefaultNavigationPath(); 
           } 
          } 
          if(StringUtil.isNotEmpty(navPath)) { 
           cs.setNavigationPath(navPath); 
          } 
         } 
        } 
    } 
    

Так что это может объяснить, почему он не будет инициализирован до 2 просмотра страницы. Вы можете попробовать принудительно инициализировать ConversationState, прежде чем пытаться его использовать, возможно, в beforePageLoad, вызвав один из методов get.() метода com.ibm.xsp.extlib.component.layout.ConversationState. Обратите внимание, что параметр boolean указывает, что метод создает ConversationState, если он не существует. Я не очень сильно разбираюсь в Javascript ServerSide, но думаю, это работает? Смыслы верны.

#{javascript: com.ibm.xsp.extlib.component.layout.ConversationState.get(facesContext, true); } 

Если вы делаете это в Java, то:

ConversationState.get(FacesContext.getInstance(), true); 

ли это звучит как объяснение того, почему вы видите свое поведение?

+0

Приложение использует OneUILayout, поэтому, хотя ваше объяснение дает что-то повод, не имеет смысла, учитывая, что это поведение происходит только для одного из трех пользователей. –

+0

Для 1 пользователя это происходит на каждой новой странице? или только для самой первой страницы, которую они загружают? все ли они получают доступ к приложению с помощью того же исходного URL-адреса? –

+0

Все они имеют доступ через один и тот же URL-адрес. Поскольку мы теперь удалили панель инструментов отладки, мы больше не можем видеть значение talkstate. Спасибо за Ваш ответ –

Смежные вопросы