Переменные ViewScope становятся нулевыми, keepsessionalive не работает? - PullRequest
0 голосов
/ 03 июля 2018

У меня проблема с переменными View Scope в Lotus Notes 9.0.1.

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

Все это работает каждый раз, насколько я тестировал, но один пользователь приложения сообщил об исключительной ситуации во время выполнения. Следуя дальнейшим исследованиям, я убедился, что ошибку можно воспроизвести, выполнив сборку приложения и нажав на ссылку на открытой странице. Читая о таких проблемах и журнале сервера, я узнал, что это может быть вызвано потерей переменных в области видимости, что может быть вызвано тайм-аутом сеанса, но наше приложение должно иметь возможность справляться с тайм-аутами сеанса, используя keepsessionalive элемент управления из библиотеки расширений XPages - но, похоже, он работает не так, как задумано.

Я хотел бы получить информацию о других возможных причинах / триггерах для проблемы (я не смог воспроизвести проблему, о которой сообщал пользователь до сих пор), и альтернативы, чтобы поддерживать сеанс в течение длительных периодов времени. без потери переменных области действия.

Вот код:

Название аккордеона (где переменные загружены, остальные названия похожи):

    viewScope.contadorParecer=carregaContadoresParecer(); //Where the variable should be loaded
    if(viewScope.contadorParecer.total>0)
    return "Pareceres ("+viewScope.contadorParecer.total+")";
    else
    return "Pareceres"

Script library method (similar code for the others):

    function carregaContadoresProposta() {
        try {
            contadoresProposta = {};
            try {
                if (arguments[0])
                    var totalizar = arguments[0];
                else
                    var totalizar = compositeData.totalizarUnidade;
            } catch (e) {
                var totalizar = false;
            }

            if (!totalizar) {
                var strView = "vw_proposta_contador";
                var filtro = sessionScope.usuarioLogado.nome;
            } else {
                var strView = "vw_proposta_unidade_contador";
                var filtro = sessionScope.usuarioLogado.fk_entidade_funcional;
            }

            //cria navegador
            var nav: NotesViewNavigator = database.getView(strView).createViewNavFromCategory(filtro);
            var entry: NotesViewEntry = nav.getFirst();
            var total = 0;
            while (entry != null) {
                var categoria = entry.getColumnValues()[1];
                categoria = @UpperCase(categoria);
                contadoresProposta[categoria] = entry.getColumnValues()[entry.getColumnValues().size() - 1];
                if (!categoria.isEmpty()) 
                total += contadoresProposta[categoria];
                var tmpentry: NotesViewEntry = nav.getNextCategory();
                entry.recycle();
                entry = tmpentry;
            }
            contadoresProposta["total"] = total;

            return contadoresProposta.clone();
        } catch (e) {
            printError(e, "carregaContadoresProposta", "Script Library ContextualProposta");
        }
    }

Пользовательский элемент управления (contadorAcompanhamento, contadorProposta и contadorParecer обнуляется перед чтением):

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

Первая ошибка, обнаруженная в журнале сервера пользователя: (вероятно, вызвана установкой tmpEntry в библиотеке сценариев) Возникла исключительная ситуация при вызове метода NotesViewNavigator.getNextCategory ()

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Если у пользователя есть много вкладок, открытых для разных страниц в приложении, карта страниц на стороне сервера (представления, таким образом, viewScope) может быть заполнена, а ранее использованная карта отбрасывается. Это обрабатывается в свойствах Xsp на вкладке «Постоянство». Вокруг есть различные слайды сессий, и это также описано в Руководствах по мастерингу XPages и XPages Portable.

Возможно, причина в этом, но для подтверждения или опровержения потребуется дополнительная информация от пользователя.

0 голосов
/ 06 июля 2018

Где находится инициализация переменной viewScope "contadorProposta"? Вы уверены, что он был инициализирован? ViewScope теряется, когда пользователь перезагружает страницу - возможно ли это?

0 голосов
/ 04 июля 2018

Как объяснил Павел: вас ждет долгое расследование. Однако реальная проблема, с которой вы сталкиваетесь, - это неудачный подход к использованию переменной области видимости. Область действия сеанса и приложения может быть истекла и истекает, поэтому никогда не принимайте их как должное и проверяйте их существование. Поэтому вместо заполнения значений в несвязанном месте вы проверяете их наличие в функции скрипта.

Нечто подобное (в библиотеке скриптов SSJS):

  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
      }

  } 

В том же духе. Тогда вы можете использовать carregaContadoresParecer.total() и carregaContadoresParecer.contadorParecer('someLabel');

Таким образом, вы бы не хранили функцию в области видимости, а в JavaLib, а сохраняли только значения в области и проверяли наличие этих значений. Я бы использовал управляемый компонент, но это потому, что я хорошо владею Java - может быть, не ваша вещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...