Xpages ViewScope变量变为null,keepsessionalive不工作?

Xpages ViewScope变量变为null,keepsessionalive不工作?,xpages,lotus-notes,lotus-domino,xpages-ssjs,xpages-extlib,Xpages,Lotus Notes,Lotus Domino,Xpages Ssjs,Xpages Extlib,LotusNotes9.0.1中的视图范围变量有问题 用户报告我的应用程序出现错误,其中viewscope变量在页面加载时可能变为null-该变量是一个数组,自定义控件中标签的计算值尝试访问该数组,从而导致运行时异常。应通过库方法加载变量,该方法由accordion窗格的计算标题脚本调用,该窗格包含试图读取该变量的自定义控件 就我所测试的而言,整个过程每次都能正常工作,但应用程序的一个用户报告了运行时异常。通过进一步调查,我验证了通过构建应用程序并单击打开页面上的某个链接可以复制错误。通过阅读这

LotusNotes9.0.1中的视图范围变量有问题

用户报告我的应用程序出现错误,其中viewscope变量在页面加载时可能变为null-该变量是一个数组,自定义控件中标签的计算值尝试访问该数组,从而导致运行时异常。应通过库方法加载变量,该方法由accordion窗格的计算标题脚本调用,该窗格包含试图读取该变量的自定义控件


就我所测试的而言,整个过程每次都能正常工作,但应用程序的一个用户报告了运行时异常。通过进一步调查,我验证了通过构建应用程序并单击打开页面上的某个链接可以复制错误。通过阅读这些问题和服务器日志,我了解到这可能是由于范围变量丢失造成的,可能是由会话超时触发的,但是我们的应用程序应该能够使用XPages扩展库中的keepsessionalive控件来处理会话超时,但它似乎没有按预期工作

我想要一些关于这个问题的其他可能原因/触发因素的信息(到目前为止,我无法重现用户报告的问题),以及在不丢失作用域变量的情况下保持会话长时间活动的替代方案

代码如下:

手风琴标题(加载变量时,其他标题类似):

自定义控件(contadorAcompanhamento、contadoraproposta和contadoraparecer在读取前变为null):

运行时错误:

Error while executing JavaScript computed expression
Script interpreter error, line=11, col=37: 'viewScope.contadorProposta' is null and cannot be accessed as an array
在用户的服务器日志上发现的第一个错误:(可能是由scriptlibrary中的tmpEntry集引起的)
调用方法NotesViewNavigator.getNextCategory()

时出现异常,正如Paul解释的那样:您可能需要进行长期调查。然而,您面临的真正问题是使用作用域变量的不幸方法。会话和应用程序作用域可能会超时和过期,所以不要认为它们是理所当然的,并检查它们是否存在。因此,您可以在脚本函数中检查值是否存在,而不是在不相关的位置播种值

大致如下(在SSJS脚本库中):

沿着这些路线。然后可以使用
carregaContadoresParecer.total()
carregaContadoresParecer.contadoresparecer('someLabel')


所以,您不会将函数存储在作用域中,而是存储在JavaLib中,只将值存储在作用域中,并检查该值是否存在。我会使用托管bean,但这是因为我对Java很熟悉-可能不是你喜欢的东西。

如果用户在应用程序中为不同的页面打开了很多选项卡,则可以填充页面的服务器端映射(视图,因此
viewScope
),并删除以前使用的页面。这在持久性选项卡上的Xsp属性中处理。这里有各种各样的课程幻灯片,在掌握XPages和XPages可移植命令指南中也有介绍


这可能是原因,但需要用户提供更多信息来确认或反驳。

viewScope变量“contadorProposta”初始化在哪里?你确定它已经初始化了吗?当用户重新加载页面时,viewScope将丢失-可能吗?

听起来用户告诉您的不是整个过程,而是缺少关键信息。当你能够解决问题时,你没有解释问题的原因和重现的步骤。此外,服务器日志中的错误是否相关?您提到了
keepSessionAlive
组件,但没有确认您或用户是否将浏览器选项卡以及浏览器中应用程序的任何其他选项卡保持一段时间不活动。如果不是,会话超时是不相关的。我相信服务器日志是不相关的。我认为这是变量被清空的结果,不太可能是原因,因为有几个变量变为null,并且不是所有变量都调用getNextCategory来填充。我把它包括在内,因为我是一个初学者,我想我可能会错过一些东西。是的,除了浏览器上打印的运行时错误外,用户没有提供关于错误的更多信息,并且错误发生在从一个选项卡转到另一个选项卡(部分刷新)时。复制是一件痛苦的事情,但该页面可能已经停用了一段时间。“我验证了可以通过构建应用程序并单击打开页面上的某个链接来复制错误。”->这是否意味着您在使用应用程序的同时构建应用程序?是的,umeli。我知道这可能不是问题的实际原因,构建应用程序只会导致变量被左右删除。我认为这是一个重要的信息(以及我目前用来测试应用程序行为的方式),因为它创建了用户所看到的完全相同的运行时错误屏幕。我的建议是:停止在视图中使用具有麻烦的初始化脚本的私有属性,并用“VIEW”范围实现托管bean。这将解决值初始化的所有问题。accordion容器通过调用脚本库中的“carregaContadoresProposta…”函数,以相同的方式初始化“contadorParecer”、“contadorProposta”和“ContadorAcompanmento”,类似于carregaContadoresProposta。这三个都变得无效。不确定某些重新加载的情况是否会导致viewscope丢失,但无论哪种方式,都应该在页面加载时重新计算它-我甚至在读取它们的脚本上添加了一个调用来加载所有三个变量的值(我不完全确定这是否有效-我无法以任何方式重现错误)
var label=item.split("|")[0];
label=label.indexOf("{")!=-1?label.split("{")[0]:label;

var parecer=compositeData.parecer[0];
var acompanhamento=compositeData.acompanhamento;

if(!parecer){
    if(acompanhamento){
        var total=viewScope.contadorAcompanhamento[@UpperCase(label)];
    }else{
        var total=viewScope.contadorProposta[@UpperCase(label)];
    }
}else{
    var total=viewScope.contadorParecer[@UpperCase(label)]; 
}

if(total!=undefined)
    return label+" ("+ total +")"
else
    return label;
Error while executing JavaScript computed expression
Script interpreter error, line=11, col=37: 'viewScope.contadorProposta' is null and cannot be accessed as an array
  var carregaContadoresParecer = {
      storage : null,
      total : function() {
          if (storage === null) {
             storage = populateStorage();
          }
          return storage.total;
      },
      contadorParecer : function(whatSearch) {
          if (storage === null) {
             storage = populateStorage();
          }
              // your code here
      }

  }