xsp.extlib.convstate返回null

时间:2016-11-29 02:31:55

标签: xpages xpages-extlib

我有一个Xpage应用程序使用扩展库,其中xsp.extlib.convstate为三个用户之一为'null',直到他们手动刷新页面。所有三个用户都使用Citrix通过RDP访问应用程序,互联网选项对于这三个用户都是相同的。试图弄清楚为什么会发生这种情况。该应用程序仅在一台9.0.1服务器上运行。

1 个答案:

答案 0 :(得分:0)

从源代码的外观来看,如果尚未初始化conversationState,则在任何时候都不会初始化conversationState:

    渲染响应阶段之后的
  1. (在阶段侦听器中: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. 在UIApplicationLayout的setParent方法中,这似乎受到'isRestoringState'条件的保护,这意味着我不认为这会在页面的第一个视图上运行,因为不会任何恢复的状态。

    @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);
                }
            }
        }
    }
    
  3. 所以这可以解释为什么在第二页视图之前它不会被初始化。 您可以尝试在尝试使用它之前强制初始化ConversationState,可能在beforePageLoad中,通过调用com.ibm.xsp.extlib.component.layout.ConversationState的get()方法之一。 请注意,boolean参数告诉方法创建ConversationState(如果它不存在)。 我没有做太多ServerSide Javascript,但我猜这有效吗?情绪是正确的。

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

    如果你在java中这样做,那么:

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

    这听起来像是为什么你看到你的行为的解释?